새소식

코딩테스트/백준_골드

[C++][백준 2448] 별 찍기 - 11

  • -

[문제]

https://www.acmicpc.net/problem/2448

 

2448번: 별 찍기 - 11

첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수)

www.acmicpc.net

[문제 풀이]

분할정복을 이용해서 풀자.

별 찍기 - 10 과 비슷하게 풀 수가 있으나 처음 위치를 x좌표를 n-1로 두어야 하는 것에 유의하자.

 

만일 사이즈(높이)가 3보다 크다면(10)

위치를 3곳으로 나누어 주자.

첫번째 위치는 현재 위치 그대로(11)

두번째 위치는 x를 현재 크기의 1/2를 뺀 지점, y를 현재 크기의 1/2를 더한 지점으로 (12)

세번째 위치는 x를 현재 크기의 1/2를 더하고 y를 현재 크기의 1/2를 더한 지점으로 보내자.(13)

 

현재 크기가 3이라면 별을 현재 위치, 현재위치에서 높이가 1내려간(배열로는 올라간) 위치에서 양옆에 찍어주자.(17~19)

마지막으로 받침에 x좌표가 현재 위치의 -2인 지점부터 시작해서 5칸 별을 찍어주자.(21~22)

 

x의 크기는 0부터 2*n-1까지 이니 범위에 주의하자.(35)

[코드]

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
47
48
#include<iostream>
#define endl "\n"
 
using namespace std;
 
char star[10000][10000];
 
void fold(int y, int x, int size){
 
    if(size > 3){
        fold(y ,x ,size/2 );
        fold(y + size / 2 ,x - size / 2 ,size/2);
        fold(y + size / 2, x + size / 2  ,size/2);
        return;
    }
 
    star[y][x] = '*';
    star[y+1][x-1= '*';
    star[y+1][x+1= '*';
 
    for(int i = x;i<x+ size * 2 -1; i++){
        star[y+2][i-2= '*';
    }
 
    return;
}
 
int main(){
    int n;
    cin>>n;
 
    fold(0,n-1,n);
 
    for(int i = 0;i<n;i++){
        for(int j = 0 ;j< n * 2-1 ;j++){
            if(star[i][j] == '*'){
                cout<<'*';
            }
            else{
                cout<<" ";
            }
        }
        cout<<endl;
    }
 
 
    return 0;
}
cs

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.