[백준/C++] 2447번 별 찍기 - 10
처음 문제를 읽었을 때 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