백준 2447번 별 찍기 -5 (파이썬)


2447번 (별 찍기 -5)


머리로는 이해가 되는데 어떻게 접근해야할지 감이 안잡혀서 고민을 많이 한 문제였다.
처음에는 전체 별을 찍어두고 구멍을 뚫어야 할 위치를 일일히 계산해 빈칸을 채워넣는 방식으로 진행했으나 더 효율적인 재귀를 짜고 싶었다.
구글링 중 내가 원하는 방향으로 이해할 수 있는 코드를 작성하신 분이 계셔서 그 분 코드를 참조하였다.
참고한 블로그 : https://calmlife.tistory.com/47

접근 방식

  • n의 크기와 상관없이(작은 칸이 몇 개 있든 간에) 전체를 9*9 배열로 생각한다.
  • 이 9*9 배열의 (1,1)은 빈칸이 되고 나머지는 *로 채워지게된다.
  • (1,1)을 제외한 남은 8칸을 재귀로 보내고 가장 작은 한칸이 될 때 까지 진행한다.


파이썬 코드

import sys
n = int(sys.stdin.readline())
#빈칸으로 배열 만들어두기
stars = [[' ' for i in range(n)] for i in range(n)]

def print_star(x,y,n,s):
    # size는 큰 9*9배열의 한 칸에 몇개의 작은 칸들이 들어가는지 계산하는 것이다.
    size = n // 3
    # 재귀의 끝. 더 이상 쪼갤 수 없는 블록일 때 빈칸대신 *을 넣어준다. 
    if n == 1:
        s[x][y] = '*'
        return
    # [0,0]칸
    print_star(x, y, size, s)
    # [0,1]칸
    print_star(x, y + size, size, s)
    # [0,2]칸
    print_star(x, y + size + size, size, s)

    # [1,0]칸
    print_star(x + size, y, size, s)
    # [1,1]칸은 늘 빈칸이므로 진행하지 않는다.

    # [1,2]칸
    print_star(x + size, y + size + size, size, s)

    # [2,0]칸
    print_star(x + size + size, y, size, s)
    # [2,1]칸
    print_star(x + size + size, y + size, size, s)
    # [2,2]칸
    print_star(x + size + size, y + size + size, size, s)

print_star(0,0,n,stars)

for i in range(n):
   print(''.join(stars[i]))

기억해두면 좋을 것

  • 출력문에 사용한 join함수는 ‘구분자’.join(리스트) 의 형식으로 사용되며 리스트의 각 요소를 문자열로 합쳐서 반환해주는 함수이다. 구분자를 따로 표기하게 되면 요소와 요소사이를 그 구분자로 구분하여 문자열이 반환된다.
  • 예를 들어 ‘_‘.join([‘a’,’b’,’c’])이면 “a_b_c” 문자열이 반환된다.





© 2020.09. by 다로

Powered by theorydb