728x90

# 해당 포스팅은 이제 막 알고리즘 공부를 시작한 초보 수준에서 작성했음을 이해해주시고, 비난보다는 따뜻한 조언을 부탁드립니다.


안녕하십니까, 간토끼입니다.

오늘은 백준 10994번 (별 찍기-19)에 대해 다뤄보겠습니다.

 

 

1. 문제 링크

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

 

10994번: 별 찍기 - 19

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

www.acmicpc.net

별 찍기 문제입니다.

입력으로 N이 주어지면 이를 바탕으로 규칙에 의거하여 별의 개수를 출력하면 되는데요.

규칙N의 개수에 따라 출력하는 양이 달라지는데, 별이 출력되는 array를 2차원 배열이라고 하면 각 행과 열의 개수는 (4*N)-3개입니다.

즉, N=2면 5x5 사이즈의 array가 만들어지고, N=3이면 9x9 사이즈의 array가 만들어지는 셈이죠.

그리고 N일 때 출력되는 결과를 보면, N-1에서 만들어지는 배열이 재귀적으로 반복됨을 알 수 있습니다.

즉 재귀함수를 이용하면 쉽게 구현할 수 있습니다.

2. 접근 방법

다음과 같이 접근하였습니다.

먼저 재귀적으로 반복됨을 파악해야하는데요.

보시면 (1), (2), (3), (4)번의 선분의 패턴이 반복되고 있음을 알 수 있습니다.

그리고 중간에 대각선을 따라가면 N이 1씩 줄어들면서 패턴이 가운데로 반복되면서 몰리고 있음을 캐치하시면 푸는 데 큰 무리는 없습니다.

함수를 보시면 반복문을 이용해 1,2,3,4번에 해당되는 배열의 위치에 "*" 값을 대입해줍니다.

그리고 반복문이 종료되면 N, 그리고 새로운 좌표(new_x, new_y)를 최신화해줍니다.

대각선을 따라간다는 것은 최초 위치에서 x+2, y+2 로 좌표를 최신화한다는 의미임을 쉽게 아실 수 있을 겁니다.

 

3. 코드

# 백준 : 별찍기 10994

star = int(input()) # 별 개수
length = (4*star)-3
map_array = [[' ']*(length) for _ in range(length)]

def star_19(n, x, y):
    # 재귀적으로 별 찍기
    global map_array
    
    length = (4*n)-3
    if length == 1:
        map_array[x][y] = "*"
        return
    
    else:    
        for i in range(length):
            map_array[x][y+i] = "*" # 윗변(1번 선분)
            map_array[y+i][x] = "*" # 좌측변(2번 선분)
            map_array[x+(length-1)][y+i] = "*" #아랫변(3번 선분)
            map_array[x+i][y+(length-1)] = "*" #우측변(4번 선분)
        n = n-1
        x = x+2
        y = y+2
        star_19(n, x, y)
        return

star_19(star, 0, 0)
for i in range(length):
    print(*map_array[i], sep = '')

 

감사합니다.

잘 읽으셨다면 게시글 하단에 ♡(좋아요) 눌러주시면 감사하겠습니다 :)

(구독이면 더욱 좋습니다 ^_^)

* 본 블로그는 학부생이 운영하는 블로그입니다.

따라서 포스팅에 학문적 오류가 있을 수 있으며, 이를 감안해서 봐주시면 감사하겠습니다.

 


- 간토끼(DataLabbit)

- B.A. in Economics, Data Science at University of Seoul

728x90

+ Recent posts