관리 메뉴

민우의 코딩노트

[BOJ 2448] 별 찍기 - C++ 본문

Algorithm/BOJ

[BOJ 2448] 별 찍기 - C++

미미누 2022. 8. 11. 20:30

✅️[문제/problem]
https://www.acmicpc.net/problem/2448

2448번: 별 찍기 - 11

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

www.acmicpc.net


✅️[풀이/Explanation]

재귀 문제이다!
종료 조건(base_condition)은 n=3일때 그리고, 종료한다.
그림에서 가로는 n, 세로는 n/2 인걸 알 수 있다. (x,y) 기준으로 재귀적으로 3개의 삼각형을 그려주면 되는데, (x+n/2, y), (x, y+n/2), (x+n/2, y+n)의 좌표를 호출하면 된다!
memset으로 배열을 공백으로 초기화하고 별을 찍을때 *값을 대입했다.


✅️[코드/code]


#include <bits/stdc++.h>

using namespace std;

char board[10000][10000];

void printx(int x, int y){

    board[x][y+2] = '*';

    

    board[x+1][y+1] = '*';

    board[x+1][y+3] = '*';

    

    board[x+2][y] = '*';

    board[x+2][y+1] = '*';

    board[x+2][y+2] = '*';

    board[x+2][y+3] = '*';

    board[x+2][y+4] ='*';

}

void star(int n, int x, int y){

    if(n == 3) {

        printx(x,y);

        return;

    }

    star(n/2, x, y+n/2);

    star(n/2, x+n/2, y);

    star(n/2, x+n/2, y+n);

}

int main() {

    ios::sync_with_stdio(0);

    cin.tie(0);

    

    int n;

    cin >> n;

    memset(board, ' ', sizeof(board));

    star(n, 0,0);

    for(int i=0; i<n; i++){

        for(int j=0; j<2*n; j++){

            cout << board[i][j];

        }

        cout << '\n';

    }

    

}


'Algorithm > BOJ' 카테고리의 다른 글

[BOJ 15649] N과 M(1) - C++  (2) 2022.08.11
[BOJ 2667] 단지번호붙이기 - C++  (0) 2022.08.10
[BOJ 2630] 색종이 만들기 - C++  (0) 2022.08.09
2583번 영역구하기 - C++  (0) 2022.08.04
1627번 곱셈 - C++  (0) 2022.08.04