[BOJ] Python 백준 2447번 별 찍기-10 골드5
https://www.acmicpc.net/problem/2447
문제 풀이
해당 문제는 처음 반복문을 접할 때 풀어보는 별 찍기의 재귀버전이다.
3X3 크기의 한 패턴이 정해져 있고 크기가 증가할수록 같은 패턴이 반복되는 형태인데 처음엔 직관적으로 간단하게 생각해서 9 부분으로 나눠 각 Position에 대해 번호를 파라미터로 넘기고 해당 Position에 따라 별, 공백, 별 줄 바꿈 출력을 생각했으나 뜻대로 되지 않았다.
3X3 패턴이 출력되는 만큼 줄 바꿈도 같이 출력이 되었고 일정한 패턴의 확장이 아니라 그냥 패턴의 연속된 출력이었기 때문이다.
그래서 접근 방식을 다시 생각해봤다.
일단 3X3 패턴을 하나의 원소로 가정하고 3배씩 증가할 때마다 행과 열을 복사하는 방식이다.

위 사진처럼 직전의 패턴에 대해 증가할때마다 행을 3배로 복사하고 1,3번째 행은 열을 3배로, 2번째 행은 패턴의 길이만큼 공백을 넣어주면 된다.
파이썬은 리스트나 문자열의 복사가 상당히 쉬운 편이기 때문에 다행인 것 같다.
직전의 패턴에서 한 줄씩 문자열로 치환을 하면 나머진 구현에 어려움이 있을 것 같진 않다.
N=int(input())
# 하나의 별표에서 시작한다 가정
res=["*"]
def func(n):
global res
if n>3:
func(n//3)
# 행 X3
res=res*3
# 열 X3
for i in range(len(res)//3):
res[i]=res[i]*3
# 열 + 공백 + 열
for i in range(len(res)//3,len(res)*2//3):
res[i]=res[i]+" "*len(res[i])+res[i]
# 열 X3
for i in range(len(res)*2//3,len(res)):
res[i]=res[i]*3
func(N)
for i in range(len(res)):
print(res[i])
재귀를 타면서 문자열 리스트를 공유해야 하기 때문에 결과 리스트를 전역변수로 공유하는 global을 사용했다.
필자는 이게 직관적이기에 사용했는데 각자 파라미터로 직접 데이터를 보내는 방식과 비교하여 본인이 편한 방식대로 구현하면 된다.
문제에서 입력 조건이 3 이상이기 때문에 조건문에 3 초과인 경우 재귀를 타도록 구현하였는데 제출하고 생각해 보니 애초에 res 리스트는 빈 리스트로 초기화하고 n == 1인 경우에 res 리스트를 별표 문자열 하나로 초기화 하는 방식이 다소 깔끔하지 않을까 생각이 든다.

문제를 맞긴 했지만 처음에 다소 접근 방식에서 헤맸던 문제이다.
함수를 실행시켰을 때와 재귀를 타고 다시 실행했을 때의 실행결과를 고려하다 보니 스스로 발목을 잡는 것처럼 복잡하고 헷갈려서 재귀 문제는 최대한 같은 부분을 단순화시켜서 함수 그 자체가 실행하는 과정에 집중하는 연습과 경험이 필요한 것 같다.
'알고리즘 > 알고리즘 문제 풀이' 카테고리의 다른 글
[BOJ] Python 백준 2294번 동전 2 골드 4 (0) | 2022.07.02 |
---|---|
[BOJ] Python 백준 4485번 녹색 옷 입은 애가 젤다지? 골드 4 (0) | 2022.04.19 |
[BOJ] Python 백준 16928번 뱀과 사다리 게임 실버 1 (0) | 2022.03.01 |
[BOJ] Python 백준 13458번 시험 감독 브론즈 2 (0) | 2022.03.01 |
[BOJ] Python 백준 3425번 고스택 골드 3 (0) | 2022.02.18 |