반응형

1. 문제

백준 2447 번

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

 

 

2. 아이디어

 

 (1) n = 3^1 일때를 생각해보자! (^ 기호는 제곱을 나타냅니다. ex) 2^2 = 4, 2^3 = 8)

 

    다음과 같이 별이 찍힌다는 것을 알 수 있다.

 

 (2) 그럼 이제 일반적인 n = 3^i에대하여 그림을 상상해보자

 그림을 보면 알겠지만, n = 3^1 일때는 가운데를 비워두고 "별"이 찍힌 것처럼

 n = 3^i 일때는 가운데를 비워두고 "n = 3^(i-1) 일때의 별 배열"이 찍힙니다.

 

이게 핵심아이디어 입니다. 이것만 이해하셨다면 이문제는 푼것이나 다름없습니다 ㅎㅎ

 

3. 풀이

(1) 코드

# 별 찍는 재귀 함수
def draw_star(n) :
    global Map
    
    if n == 3 :
        Map[0][:3] = Map[2][:3] = [1]*3
        Map[1][:3] = [1, 0, 1]
        return

    a = n//3
    draw_star(n//3)
    for i in range(3) :
        for j in range(3) :
            if i == 1 and j == 1 :
                continue
            for k in range(a) :
                Map[a*i+k][a*j:a*(j+1)] = Map[k][:a] # 핵심 아이디어

N = int(input())      

# 메인 데이터 선언
Map = [[0 for i in range(N)] for i in range(N)]

draw_star(N)

for i in Map :
    for j in i :
        if j :
            print('*', end = '')
        else :
            print(' ', end = '')
    print()

(2) 해설

 자 이제 그럼 구체적으로 살펴볼까요?

draw_star라는 이름의 재귀함수를 선언합니다. 

n = 3^1 이라면 (가장 기본적인 형태) 우리가 알고있는 별데이터를 입력합니다.

그 뒤에 나오는 코드가 n = 3^i 일때 입니다.

코드를 이해하셔서 내것으로 만들기를 바랍니다.

 

또한, 본 문제를 해결하기 위해 우리가 메인으로 다룰 데이터는 2차원 배열입니다!

가로 세로 길이가 각각 n인 2차원 배열을 만들어서 별의 존재 여부를 저장하는 것이죠.

 

코드가 그리 길지는 않으니 금방 이해하실 수 있을거라 생각됩니다.

추가적으로 2차원 배열에서1은 '별' 0은 '빈칸'이라는것을 알아두세요!

 

오늘도 봐주셔서 감사합니다~! (댓글, 공감눌러주는 센스~ㅎㅎ)

p.s. 질문과 오류 지적은 언제나 환영입니다.

반응형