PS/Baekjoon Online Judge

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

kimyoungrok 2021. 7. 23. 03:00
728x90

백준 - 2448


풀이

 

이진 트리를 닮았다.

출력 할 삼각형의 맨 위의 좌표(빨간 원)를 (0, N-1)이라고 하자.

이진트리 처럼 좌측 하단 삼각형의 맨 위 좌표(왼쪽 초록 원)는 (0 + N/2, N-1 - N/2), 우측 하단 삼각형의 맨 위 좌표(오른쪽 초록 원)는 (0 + N/2, N-1 + N/2)이다.

분할정복을 시행할 때마다, 입력받은 크기를 2로 나누어 건네주며, 전달받은 크기가 3이 될 때 배열에 빨간원 - 좌측 초록원 - 우측 초록원 이 순서대로 가장 작은 삼각형 내부에 별을 채워 넣는 것이다.

 

출력형식에 약간의 장난(?)이 숨어있다.

예제 출력을 드래그 해보니, 각 행의 마지막 별을 찍고 개행이 아니라, 공백을 출력해줘야 한다.

memset()를 사용해 배열을 빠르게 초기화하고, 별을 채워 넣자.


소스코드

#include <stdio.h>
#include <memory.h>
char arr[3072][6144];
void mark_star(int row, int col, int N){
    if (N == 3){
        arr[row][col] = '*';
        arr[row+1][col-1] = '*';
        arr[row+1][col+1] = '*';
        arr[row+2][col-2] = '*';
        arr[row+2][col-1] = '*';
        arr[row+2][col] = '*';
        arr[row+2][col+1] = '*';
        arr[row+2][col+2] = '*';
    }else {
        mark_star(row, col, N/2);
        mark_star(row + N/2, col - N/2, N/2);
        mark_star(row + N/2, col + N/2, N/2);
    }
}
int main(){
    int N;
    scanf("%d", &N);
    memset(arr, ' ', sizeof(arr));
    mark_star(0, N-1, N);
    for (int i = 0; i < N; i++){
        for (int j = 0; j < 2*N; j++)
            putchar(arr[i][j]); 
        putchar(10);
    }
}

출처 및 참고자료

 

2448번: 별 찍기 - 11

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

www.acmicpc.net

 

[C언어/C++] memset 함수 메모리 초기화

안녕하세요. BlockDMask 입니다. 오랜만에 C언어, C++주제를 포스팅 하네요. 2020년 남은 11월 12월에는 C언어 C++주제는 목요일에 포스팅할 예정입니다. 일요일에는 파이썬 남은 문법들을 진행할 예정

blockdmask.tistory.com

728x90

'PS > Baekjoon Online Judge' 카테고리의 다른 글

[백준 1712] 손익분기점 [C]  (0) 2021.07.23
[백준 2522] 별 찍기 - 12 [C]  (0) 2021.07.23
[백준 2447] 별 찍기 - 10 [C]  (0) 2021.07.23
[백준 2446] 별 찍기 - 9 [C]  (0) 2021.07.22
[백준 2445] 별 찍기 - 8 [C]  (0) 2021.07.22