PS(Problem Solving)/BOJ

[백준/BOJ] 2447번: 별 찍기-10

JunsuKim 2021. 12. 30.
728x90

https://www.acmicpc.net/problem/2447

 

2447번: 별 찍기 - 10

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이

www.acmicpc.net

문제

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.

크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.

***
* *
***

N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.

해설

우선 N이 3인 경우

이와 같은 형태를 뛴다. (1, 1)이 빈칸으로 있는 것을 알 수 있다.

이러한 도형이 나열이 되있다 하면, i%3==1 && j%3==1일 때 빈 칸을 찍으면 된다.

 

N이 9인 경우를 보자.

가운데 빈칸이 있는 것을 확인할 수 있다.

이는 (3, 3), (3, 4), (3, 5), (4, 3), (4, 4), (4, 5), (5, 3), (5, 4), (5, 5)가 빈 칸으로 있는 것을 확인할 수 있다.

이 부분이 비어있다는 것을 바꿔보면 (i/3)%3==1 && (j/3)%3==1일 때 빈 칸인 것이다.

 

이처럼 결국 3의 제곱수로 크기가 커져도 가운데에 빈칸이 생긴다는 조건은 같다.

이를 재귀를 돌리면 풀면 다음 코드와 같다.

소스 코드

import java.lang.StringBuilder
val sb = StringBuilder()

fun main() {
    val num = readLine()!!.toInt()
    for(i in 0 until num) {
        for(j in 0 until num) {
            print(i, j, num)
        }
        sb.append("\n")
    }
    println(sb.toString())
}

fun print(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 print(i, j, num/3)
    }
}
728x90

댓글