출처 : 백준, https://www.acmicpc.net/problem/2447
2447번: 별 찍기 - 10
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이
www.acmicpc.net
더보기
첫 번째 풀이 : 무식
def makezero(div_3, x, y):
if div_3 == 0:
return
#0 넣기
for i in range(x+div_3, x+(div_3*2)):
for j in range(y+div_3, y+(div_3*2)):
array[i][j] = ""
makezero(div_3//3, x, y)
makezero(div_3//3, x+div_3, y)
makezero(div_3//3, x+(div_3*2), y)
makezero(div_3//3, x, y+div_3)
makezero(div_3//3, x+(div_3*2), y+div_3)
makezero(div_3//3, x, y+(div_3*2))
makezero(div_3//3, x+div_3, y+(div_3*2))
makezero(div_3//3, x+(div_3*2), y+(div_3*2))
n = int(input())
array = [['*'] * n for _ in range(n)]
makezero(len(array)//3, 0, 0)
for line in array:
for element in line:
print('%s'%(element.ljust(1)), end="")
print()
두 번째 풀이 : 그래도 니가 낫다.
Recursive Case : 받은 행렬의 가운데를 비우고, 3x3으로 나누어 호출
Base Case : 행렬의 길이가 1x1이면 return
명시적 매개변수 : 전체 행렬 stars, 시작 행 row, 시작 열 col, 가로 길이 N
받은 행렬의 가운데를 비우는 파트랑 각 함수의 3x3으로 나눠서 재귀적으로 넣어주는 파트를 짜야한다.
def solution(stars, row, col, N):
if N == 1:
return
div = N // 3
#행렬 3등분
row = [row, row+div, row+div*2]
col = [col, col+div, col+div*2]
#가운데를 비우는 코드
for dx in range(row[1], row[2]):
for dy in range(col[1], col[2]):
stars[dy][dx] = ' '
#등분한 배열 재귀적 호출
for dx in row:
for dy in col:
solution(stars, dx, dy, div)
if __name__ == '__main__':
N = int(input())
stars = [['*'] * N for i in range(N)]
solution(stars, 0, 0, N)
#출력 코드
for i in stars:
for j in i:
print(j, end='')
print()
고찰
다시 풀어보니까 확실히 깔끔한 풀이가 나온다.
'알고리즘 > Python' 카테고리의 다른 글
[python] 프로그래머스 - 전화번호 목록 (0) | 2022.02.05 |
---|---|
[python] 프로그래머스 - 나머지가 1이 되는 수 찾기 (0) | 2022.01.20 |
[python] 프로그래머스 - 로또의 최고 순위와 최저 순위 (0) | 2022.01.07 |
[python] 백준 2789 - 블랙잭 (0) | 2022.01.07 |
[python] 백준 2292 - 벌집 (0) | 2021.11.22 |