algorithm/BOJ

BOJ 2447번 별 찍기 - 10

_JunHo 2020. 1. 6. 19:10

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

GitHub : https://github.com/junho0956/Algorithm/blob/master/2447/2447/%EC%86%8C%EC%8A%A4.cpp

 

별찍기 튜토리얼중에 가장 어려웠던 것 같다.

그만큼 별찍기 문제중 유명한 문제이기도 하다.

 

힌트는 3의 제곱수라는 것과, 공백 좌표를 유심히 봐야하는 것이다.

옆의 사진에서 보면 n = 9 기준에서 공백이 되는 좌표는

(1,1) (1,4) (1,7) (4,1) ...

그리고 정중앙에 텅비게되는 (3,3) (3,4) (3,5) ...

 

이 숫자들을 싹다 3으로 나누어본다.

3으로 나누어보면서 알게되는 규칙은

현재 좌표 dx, dy 를 3으로 나눈 나머지가 둘다 1인 경우

그 지점은 공백이 되는 지점이라는 것이다.

어느 한 좌표라도 나머지가 1이 아니라면 그곳은 * 이 되는 지점이다.

 

이를 이용하여 코드를 구현하였다.

 

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
 
int main() {
    ios::sync_with_stdio(false);
 
    int N; cin >> N;
 
    for (int i = 0; i < N; i++) {
        for (int k = 0; k < N; k++) {
            int dx = i, dy = k;
            while (1) {
                if (dx == 0 || dy == 0break;
                if (dx % 3 == 1 && dy % 3 == 1break;
                dy /= 3, dx /= 3;
            }
            if (dx && dy) cout << " ";
            else cout << "*";
        }
        cout << "\n";
    }
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter