별 찍기 - 10 성공
시간 제한메모리 제한제출정답맞은 사람정답 비율
1 초 | 256 MB | 33484 | 17247 | 12689 | 51.548% |
문제
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.
크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.
*** * * ***
N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.
입력
첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 N=3k이며, 이때 1 ≤ k < 8이다.
출력
첫째 줄부터 N번째 줄까지 별을 출력한다.
예제 입력 1 복사
27
예제 출력 1 복사
*************************** * ** ** ** ** ** ** ** ** * *************************** *** ****** ****** *** * * * ** * * ** * * * *** ****** ****** *** *************************** * ** ** ** ** ** ** ** ** * *************************** ********* ********* * ** ** * * ** ** * ********* ********* *** *** *** *** * * * * * * * * *** *** *** *** ********* ********* * ** ** * * ** ** * ********* ********* *************************** * ** ** ** ** ** ** ** ** * *************************** *** ****** ****** *** * * * ** * * ** * * * *** ****** ****** *** *************************** * ** ** ** ** ** ** ** ** * ***************************
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | import java.io.BufferedReader import java.io.BufferedWriter import java.io.InputStreamReader import java.io.OutputStreamWriter import kotlin.math.log import kotlin.math.pow /* 이 문제 같은 경우에는 input이 3 , 9 , 27 , 81 ... 이런식으로 3의 지수 형식으로 입력이된다. 1. log 변수는 지수를 얻는 과정이다 ex) 3 -> 1 , 9 ->2 2. a 변수는 문제의 중간 공백을 나타내기 위함인데, 이 공백은 1, 3, 9 ,27의 크기로 커지기 때문에, log=1이라면 a=1 log = 2 라면 a=3이 된다. 3. size 변수는 list에 add가 되면서 size가 계속 변하기때문에 고정된 값을 저장하는 역할을 한다. 4. start 변수는 중간에 공백이 들어가야하는 list의 순서를 나타내는데, 이는 계산해본 결과 1/3의 지점에서 시작을 하게된다. ex 0 (1) 2 // 0 1 2 (3 4 5) 6 7 8 5. end 변수는 이제 공백이 들어가는 list의 범위의 끝을 나타내는데, 이는 size*3-size와 같았다. 6. 그래서 우선적으로, 이 문제의 별찍기는 삼등분 되는데 1/3 부분은 list에 저장 되어있고, 2/3 부분은 공백, 3/3부분은 1/3과 대칭이다. 7. 그래서 list에 공백 부분부터 add를 해주고, 아까 start 와 end범위에의해 3/3부분은 else를 사용해서 add를 해준다. 이때, list[k-2*size]인 이유는 대칭을 이루기 때문이다. 한번 ex ) 0 1 2 3 4 5 6 7 8 을 예로 생각해서 해보자. 그리고 이제 list저장된 부분을 바꿔주는거다. 처음부터 바꾸지 않은이유는 그값이 3배가 되어버리면 공백부분2/3과 대칭부분3/3부분을 구현하는데 애매해져서 이를 맨 마지막으로 구현하였다. 그리고 또 알게된점! log를 사용할때는 float로 사용하자 double로 했더니, 243입력에서 5가 나오지않고 4가 나오는 오류가 발생했다. */ val br = BufferedReader(InputStreamReader(System.`in`)) var list = mutableListOf<String>("*") fun main()=with(br){ val bw = BufferedWriter(OutputStreamWriter(System.out)) val num = readLine()!!.toInt() //println(num.toDouble()) var log = log(num.toFloat(),3.0f).toInt() println(log) for(i in 0 until log){ var space = "" val a = ((3.0).pow(i)).toInt() for(j in 0 until a){ space+=" " } var size=list.size var start = size*3-size*2 var end = size*3-size for(k in start until size*3){ //println("k: $k") if(k in start until end){ list.add(list[k-size]+space+list[k-size]) } else{ //println(k-2*size) list.add(list[k-2*size]+list[k-2*size]+list[k-2*size]) } } for(k in 0 until start){ list[k]=list[k]+list[k]+list[k] } } for(i in 0 until list.size){ if(i==list.size-1){ bw.write("${list[i]}") } else bw.write("${list[i]}\n") } bw.flush() bw.close() } | cs |
'알고리즘 공부 > 별찍기' 카테고리의 다른 글
해결 툴 (0) | 2021.08.01 |
---|---|
백준 별찍기11 2448번 with Kotlin # log #pow (0) | 2021.07.20 |