문제 내용
문제
재귀적인 패턴으로 별을 찍어 보자. 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번째 줄까지 별을 출력한다.
예제 입력 | 예제 출력 |
27 | *************************** * ** ** ** ** ** ** ** ** * *************************** *** ****** ****** *** * * * ** * * ** * * * *** ****** ****** *** *************************** * ** ** ** ** ** ** ** ** * *************************** ********* ********* * ** ** * * ** ** * ********* ********* *** *** *** *** * * * * * * * * *** *** *** *** ********* ********* * ** ** * * ** ** * ********* ********* *************************** * ** ** ** ** ** ** ** ** * *************************** *** ****** ****** *** * * * ** * * ** * * * *** ****** ****** *** *************************** * ** ** ** ** ** ** ** ** * *************************** |
문제 풀이
문제의 조건을 살펴보면, 만약에 좌표로 해당 패턴을 생각해보자, 그러면 1, 1일 때 빈칸이고 그 외에는 *이라는 것을 알 수 있다. 또한 해당 구조는 재귀적으로 반복되고 있다.
따라서, 모든 좌표(?) 지점(?)을 2중 For문을 이용하여 돌면서, 그 지점을 num(3의 지수부)으로 나누었을때 1이라면 빈칸을, 0이라면 *를 그 외의 값이 나온다면 재귀 호출을 한다.
</>̆̈ 코드
private val sb = StringBuilder()
fun main() {
val n = readLine()!!.toInt()
for (i in 0 until n) {
for (j in 0 until n) {
stars(i, j, n / 3)
}
sb.append("\n")
}
print(sb.toString())
}
private fun stars(i: Int, j: Int, num: Int) {
if ((i / num) % 3 == 1 && (j / num) % 3 == 1) sb.append(" ")
else if (num / 3 == 0) sb.append("*")
else stars(i, j, num / 3)
}
링크