매일 조금씩

[C++] 백준 2447번: 별찍기 - 10 본문

알고리즘

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

mezo 2019. 9. 3. 02:35
728x90
반응형

 

 

별찍기를 1번부터 9번까지 마스터한 후 드디어 익숙하지 않은 출력형태에 마주하게 되었다.

예제를 통해 규칙을 유추하고 코딩을 한다.

 

 

입력은 항상 3의 제곱꼴이라는 조건이 있다.

출력형태를 보면 n을 입력하였을 때 첫번째 줄 부터 n번째 줄까지 출력하는 형태이며

지금부터 규칙을 살펴보도록 한다.

 

 

출력형태는 대칭구조를 이루므로 행, 열이 동일 조건을 갖는다고 하는것이 수월할 것으로 판단된다.

 

행을 i, 열을 j 라고 했을 때 

i와 j는 0~n-1의 숫자를 갖는다.

 

그중 빈칸이 출력되는 칸은 두가지 조건 중 하나 이상 해당 된다.

[조건]

 1) i와 j가 모두 3으로 나누었을 때 나머지가 1이다.

 2) i와 j가 모두 가장 가까운 3의 제곱꼴로 나누었을 때의 몫이 1이다. 

     ex) i = 9, j = 13 일때 9로 나눈 몫이 둘다 1임.

 

여기서 [조건] 2)는 몫이 1인 경우인데 

몫인 1을 i, j라 하고 [조건 ]1)을 하면 만족하므로 하나의 조건문으로 사용가능!

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
using namespace std;
 
class star {
private:
    int n;
public:
    star(int n) :n(n) {}    //입력받은 n을 멤버변수 n에 넣겠다.
    
    void callDraw() {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                draw(i, j);
            }
            cout << endl;
        }
    }
    void draw(int di, int dj) {
        while (di != 0) {
            if (di % 3 == 1 && dj % 3 == 1) {
                cout << " ";
                return;
            }
            di /= 3;    // 3의 배수로 나누었을 때 몫이 1이면 
            dj /= 3;    // 몫인 1을 3으로 나눈 나머지도 1이기 때문에 while문 안에서 판별 가능.
                        // 이는 여러개의 if문 사용을 줄임.
                        // di,dj를 3으로 나눈 나머지의 값이 1이 아닐때 
                        // di,dj를 3으로 나누었을 때의 몫으로 값을 바꿔주는 과정이 꼭 필요.
                        // ex) 3의 제곱승일 경우 몫이 1이 될때까지 계속 돌게됨 
        }
        cout << "*";
    }
};
 
 
 
 
int main() {
    int n;
    cin >> n;
    star *= new star(n);    //생성자함수로 만들어지는 객체의 포인터 선언.
    s->callDraw();
    delete s;
    return 0;
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

 

예제와 같이 출력되는 것을 확인!

 

 

 

 

 

테스트를 좀더 해보자.

 

 

81을 입력하면

 

 

 

바르게 출력되는 것을 확인 가능하다.

728x90
반응형

'알고리즘' 카테고리의 다른 글

[C++] 백준 10809번: 알파벳 찾기  (0) 2019.09.12
[C++] 백준 11383번: 뚊  (0) 2019.09.10
[C++] 백준 2799번: 블라인드  (0) 2019.09.09
[C++] 백준 2839번: 설탕배달  (0) 2019.09.06
[C++] 백준 10822번 : 더하기  (0) 2019.09.04