백준 2447 - 별 찍기 (10) (Python3)
코드
n = int(input())
# 일단 기본적으로 우리가 그리고자 하는
# 패턴을 줄별로 리스트에 담음
dot = ['***', '* *', '***']
def drawing_star(n):
if n == 3:
return dot
next_draw = drawing_star(n//3)
stars = []
# i : 그리고자 하는 패턴 => dot
for i in next_draw:
stars.append(i * 3)
# 가운데가 비어있어야 하므로
# 이 반복문만 i를 3개 뽑는게 아닌 2번만 뽑고
# 가운데를 n//3 만큼 여백을 추가함
for i in next_draw:
stars.append(i + ' ' * (n//3) + i)
for i in next_draw:
stars.append(i * 3)
return stars
print('\n'.join(drawing_star(n)))
문제 해설
재귀 함수를 이용한 별 찍기 문제.
사실 이 문제를 정말 오랫동안 해결하지 못하여 결국 구글링을 하여서 문제를 해결하였다. 재귀적인 호출은 정말 이해하는 과정이 까다로운 것 같다.
문제에서 가장 연상하지 못한 부분은 바로 아래의 dot 리스트 생성이다.
# 일단 기본적으로 우리가 그리고자 하는
# 패턴을 줄별로 리스트에 담음
dot = ['***', '* *', '***']
최소 입력되는 N의 값은 3이며, 3이 입력되는 경우 나오는 패턴이 최종 출력 결과를 이루는 기본 패턴이 된다. 따라서 그 기본 패턴을 한 줄씩 리스트에 저장하여 활용한다는 발상을 하지 못했다.
일단 패턴으로 쓸 리스트를 만들고 나면 N의 값을 계속 3으로 나눠주면서 최종적으로 3이 될 때까지 재귀적으로 호출하여 최종적으로 stars 리스트에 만들어지는 모든 패턴들을 넣어주고 반환한다. 그리고 최종적으로 반환된 stars 리스트를 한 줄씩 출력해주면 정답이다.
재귀 문제는 정말 많은 연습이 필요한 것 같다. 기본적인 센스와 많은 경험치가 조화를 이루어야만 문제에 접근이라도 할 수 있다는 것을 뼈저리게 깨닫는다 ㅠㅠ 열심히 많은 문제를 접해봐야겠다!!!
댓글남기기