Problem Solving

[백준/C++] 2447번 별 찍기 - 10

높은곳에영광 2022. 11. 20. 00:16


처음 문제를 읽었을 때 N이 3의 제곱이니 3으로 나누다가 3이 된 순간, 가장 작은 형태를 바로 출력해주려고 했었다.

그런데 string 배열에 담아놓기도 힘들고 3줄씩 출력을 미리 하기도 힘들다고 판단해 다른 방법을 생각하게 되었다.

가지고 있는 N을 3x3으로 나누어야 하는데 어떤 식으로 분할을 진행할까 고민했는데

각 위치에 대하여 사이즈를 줄여가며 그 위치가 빈칸이 될 위치(흰색)인지 별이 찍힐 위치(파랑)인지 확인해가는 방법으로 결정하였다. 코드를 짜다가 공통점을 찾아봤는데 row와 column을 (0, 0)으로 시작하여 N까지 진행하면

9의 크기에서는 row와 column이 각 각 (1, 1) (1, 4) (1, 7) ... 일 때로 row % 3 == 1 & column % 3 == 1인 순간이고

27의 크기에서는 row와 column이 9일 때를 포함하여 ([4,5,6] ~ [4,5,6])  일 때를 추가하여 (row / 3) % 3 == 1 & (column / 3) % 3 == 1인 순간으로 3의 배수 패턴을 보인다.

따라서 코드는 아래와 같이 작성하였다.


#include <bits/stdc++.h>

#define SETTING ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
using namespace std ;
int N ;

void Drawing(int row, int col, int size)
{
    
    if(row / size % 3 == 1 && col / size % 3 == 1) cout << " " ;
    else if(size % 3 == 0) Drawing(row, col, size / 3) ;
    else cout << "*" ;
}

int main()
{
    SETTING ;
    cin >> N ;
    
    for(int i = 0 ; i < N ; i++)
    {
        for(int j = 0 ; j < N ; j++)
            Drawing(i, j, N) ;
        cout << "\n" ;
    }
}

느낀점: 골드5인데 아직 분할정복이 익숙치 않아서 그런지, dp처럼 코드를 생각하는게 너무 어려웠다.

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

 

2447번: 별 찍기 - 10

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

www.acmicpc.net