해바

2447) 6. 함수 : 별 찍기 - 10 본문

C, C++

2447) 6. 함수 : 별 찍기 - 10

Bacha 2019. 8. 11. 17:17

문제

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

 

2447번: 별 찍기 - 10

첫째 줄에 N이 주어진다. N은 항상 3의 제곱꼴인 수이다. (3, 9, 27, ...) (N=3k, 1 ≤ k < 8)

www.acmicpc.net

 

풀이

다음과 같이 3 ✕ 3의 모양을 기반으로 중앙에 공백을 두며 그려지는 규칙이 있다. 이거 발견하는데도 애먹었다..

 

가장 먼저 33 크기의 이차원 배열을 만들어서, 큰 규모의 배열에 옮겨 출력하면 어떨까 하는 아이디어가 떠올랐다. 그래서 입력한 수만큼의 이차원 배열을 생성해주는 함수와 기본 그림을 만드는 함수를 제작했는데, 가만 보니 크기가 커질수록 공백 크기도 달라지는데, 굳이 기본 그림을 만드는 의미가 없었다.

 

별을 찍는 방법은

 

  1. 재귀 함수(Recursive Function)
  2. Only 반복문

둘 중 하나를 적용하면 해결된다. 나에겐 많이 어려웠던 문제라 각각의 코드를 올려놓고 자주 봐야겠다.

 

 

1. 재귀 함수(Recursive Function, 배열 사용)

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

//  ***
//  * *
//  ***

void drawStar(char** stars, int size, int a, int b) {
    // 전체 그림을 그림
    if(size == 1) {
        stars[a][b] = '*';
        return;
    }
    
    int n(size / 3);
    
    for(int i(0); i < 3; i++) {
        for(int j(0); j < 3; j++) {
            if(!(i == 1 && j == 1)) drawStar(stars, n, a + (i * n), b + (j * n));
        }
    }
}

char** makeArr(char** stars, int size) {
    // 여기서 입력한 수만큼 백지를 제작함
    stars = (char**)malloc(sizeof(char*) * size);
    for(int i(0); i < size; i++) {
        stars[i] = (char*)malloc(sizeof(char) * size);
        memset(stars[i], ' ', sizeof(char) * size);					// 배열 내용을 공백(' ')으로 초기화함
    }
    return stars;
}

int main() {
    int size(0);
    char** stars(NULL);
    scanf("%d", &size);
    stars = makeArr(stars, size);
    drawStar(stars, size, 0, 0);
    for(int i(0); i < size; i++) {
        for(int j(0); j < size; j++) {
            putchar(stars[i][j]);
        }
        puts("");
    }
    free(stars);
    return 0;
}

size가 1일 때만 별을 찍는단 얘기는 가장 작은 크기를 기준으로 했을 때만 별을 찍는다는 의미이다.

위 코드에서는 별을 한 개 찍을 때마다 함수를 한번 호출하므로 3 ✕ 3 크기를 그리는 데는 9번 호출된다.

DFS로 풀이한 방법도 있다.

 

 

2. Only 반복문(배열 사용 X)

https://plzfdaylife.tistory.com/125 참고.

'C, C++' 카테고리의 다른 글

10809) 7. 문자열 : 알파벳 찾기  (0) 2019.08.12
11720) 7. 문자열 : 숫자의 합  (0) 2019.08.12
1065) 6. 함수 : 한수  (0) 2019.08.07
4673) 6. 함수 : 셀프 넘버(Self Number)  (0) 2019.08.06
10817) 2. if문 : 세 수  (0) 2019.08.06
Comments