Android/Kotlin
[BOJ][KOTLIN] 2447 별 찍기 - 10
금님은님아부지
2021. 11. 20. 15:27
728x90
문제
재귀적인 패턴으로 별을 찍어 보자. 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
***************************
* ** ** ** ** ** ** ** ** *
***************************
*** ****** ****** ***
* * * ** * * ** * * *
*** ****** ****** ***
***************************
* ** ** ** ** ** ** ** ** *
***************************
********* *********
* ** ** * * ** ** *
********* *********
*** *** *** ***
* * * * * * * *
*** *** *** ***
********* *********
* ** ** * * ** ** *
********* *********
***************************
* ** ** ** ** ** ** ** ** *
***************************
*** ****** ****** ***
* * * ** * * ** * * *
*** ****** ****** ***
***************************
* ** ** ** ** ** ** ** ** *
***************************
풀이
- ' ' 빈 칸을 초기값으로 가지는 Char 2차원 배열을 선언한다.
- N = 3 예시의 * 입력 규칙을 확인한다. i = 1, j = 1 index 를 공백으로 가지고 나머지는 * 를 출력한다.
- 이를 통해 재귀를 이용하여 처리 한다.
- 시간 초과가 발생할 경우 입출력을 Scanner 대신 Buffer 를 통해서 처리한다.
import java.io.*
var star: Array<CharArray> = arrayOf()
fun main(args: Array<String>) {
val br = BufferedReader(InputStreamReader(System.`in`))
val bw = BufferedWriter(OutputStreamWriter(System.out))
val N = br.readLine().toInt()
star = Array(N) { CharArray(N) { ' ' } }
draw(N, 0, 0)
for (i in 0 until N) {
for (j in 0 until N) {
if (j == (N - 1)) bw.write("${star[i][j]}\n")
else bw.write("${star[i][j]}")
}
}
bw.flush()
bw.close()
br.close()
}
private fun draw(n: Int, i: Int, j: Int) {
if (n == 1) {
star[i][j] = '*'
} else {
val value: Int = (n / 3)
for (index1 in 0..2) {
for (index2 in 0..2) {
if (index1 == 1 && index2 == 1) {
continue
} else {
draw(value, i + (value * index1), j + (value * index2))
}
}
}
}
}
728x90