본문 바로가기

Algorithm

백준 No.2447 - 별찍기 - 10

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

 

문제

재귀적인 패턴으로 별을 찍어 보자. 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번째 줄까지 별을 출력한다.

 

 

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

 

카테고리 재귀함수에 속하는 출력 문제다.

별찍기는 대부분 for를 통해 해결할 수 있는 문제라고 생각했다. 하지만 두둥... 역시 이쪽 세계는 쉬운게 없다.

처음 접근했던 방법은 가장 작은 패턴을 재귀함수를 통해 패턴대로 이어 붙이해봤다. 하지만 개행문자가 뒤섞여있는 패턴에 대해서 패턴끼리 이어붙이는 것은 생각보다 단순하지 않았다.

뒤이어 생각한 것은 트리구조에서 이용할 수 있는 순회에 따라 출력을 시도해봤다. 하지만 이 방법도 Fail...

전위 후위 중위 모든 방법을 시도해봤으나 뒤죽박죽 출력되는 결과만 볼 수 있었다.

 

결국 검색을 통해 알게 된 답안은 n * n 배열에 빈문자열을 선언하고 재귀를 통해 각 단계의 패턴시작점에 좌표를 던져주었다. 마지막 단계로 갔을 경우 해당 좌표에 '*' 문자를 채워 배열을 출력하면 끝!

 

재귀함수는 사용하기에 따라 굉장한 편리함을 주는 알고리즘이지만 그 구조를 설계하는 단계에 있어 어려움이 많은 것 같다. 재귀함수를 스타일리쉬하게 사용하는 그 날까지 한걸음씩 다가가보자!

 

'Algorithm' 카테고리의 다른 글

[Algorithm] 경주로 건설 - 2020 카카오 인턴쉽  (0) 2022.05.10
2020 KAKAO BLIND RECRUITMENT  (0) 2020.11.07
백준 No.2565 - 전깃줄  (0) 2020.07.30