본문 바로가기

Android/Kotlin

[BOJ][KOTLIN] 2447 별 찍기 - 10

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

***************************
* ** ** ** ** ** ** ** ** *
***************************
***   ******   ******   ***
* *   * ** *   * ** *   * *
***   ******   ******   ***
***************************
* ** ** ** ** ** ** ** ** *
***************************
*********         *********
* ** ** *         * ** ** *
*********         *********
***   ***         ***   ***
* *   * *         * *   * *
***   ***         ***   ***
*********         *********
* ** ** *         * ** ** *
*********         *********
***************************
* ** ** ** ** ** ** ** ** *
***************************
***   ******   ******   ***
* *   * ** *   * ** *   * *
***   ******   ******   ***
***************************
* ** ** ** ** ** ** ** ** *
***************************

풀이

  1. ' ' 빈 칸을 초기값으로 가지는 Char 2차원 배열을 선언한다.
  2. N = 3 예시의 * 입력 규칙을 확인한다. i = 1, j = 1 index 를 공백으로 가지고 나머지는 * 를 출력한다.
  3. 이를 통해 재귀를 이용하여 처리 한다.
  4. 시간 초과가 발생할 경우 입출력을 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

'Android > Kotlin' 카테고리의 다른 글

안드로이드 스튜디오 Kotlin Memory Leak Warning("StaticFieldLeak")  (0) 2021.02.16
Subroutine  (0) 2020.06.15
MutableList  (0) 2020.06.15