티스토리 뷰

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

 

10994번: 별 찍기 - 19

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

www.acmicpc.net


1. 접근 방식

  • 가장 바깥쪽 그림을 그리는 함수를 만들자.

이 문제에서 별의 패턴은 사각형이 n번 그려진다는 것이다. 사각형 각 변의 길이는 length = 1 + (4 * (n - 1) )이다. 따라서 먼저 빈 도화지 역할로, 행과 열이 length 크기인 빈 리스트 table를 생성한다.

처음 별표(*)를 그리기 시작하는 위치(x, y)는 (0, 0)이고, 사각형의 길이는 length이다. 그림 그리는 논리는 이러하다.

① 사각형 위쪽과 아래쪽은 모두 *를 채워넣는다. 즉, table의 첫 번째 행과 마지막 행은 모든 열을 순회하면서 *로 초기화한다.

② 사각형 왼쪽과 오른쪽은 한 칸씩 건너뛰어가며 *를 그려준다. 즉, table의 첫 번째 열과 마지막 열은 두 행마다 한 번씩 *로 초기화한다. 한 행을 뛰어넘는 것은 행의 순회 step을 2로 설정하면 된다.

 

  • 위 함수를 재귀함수로 수정하자.

n = 3이라면 처음에 그려지는 사각형은 length는 9이고, (0, 0)부터 그려진다. 그 다음에는 n = 2일 때의 사각형이 그려져야 하는데, 그 위치는 (2, 2)이고 length는 5이다.  따라서 다음에 이 함수를 호출할 때는 (x, y)는 기존 x, y에 + 2한 값을 넣고, length는 -2를 해준다. length에 -4해서 5로 하지 않고, -2를 하는 이유는 2부터 7까지의 거리가 5이기 때문이다.

종료 조건은 length가 1일 때이다.

 

 

2. 정답 코드

def draw(x, y, size):
    if size <= 1:
        table[x][y] = '*'
        return

    for j in range(y, size):
        table[x][j] = '*'
        table[size-1][j] = '*'

    for i in range(x, size):
        table[i][y] = '*'
        table[i][size-1] = '*'

    draw(x + 2, y + 2, size - 2)

def print_result():
    for t in table:
        print(''.join(t))

# main
n = int(input())
length = 1 + (4 * (n-1))
table = [[' '] * length for _ in range(length)]

draw(0, 0, length)
print_result()
728x90