https://www.acmicpc.net/problem/2447
2447번: 별 찍기 - 10
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이
www.acmicpc.net
재귀를 이용하여 별을 규칙적으로 출력하는 문제이다.
별을 출력하기 위해 아래와 같은 함수을 생각했다.
- 먼저, 주어진 n을 이용하여 원소 모두가 ' '(공백)인 n * n 이차원 배열을 정의한다.
- 함수는 이차원 배열 중 확인할 부분의 제일 왼 & 위쪽의 인덱스인 row, col, 그리고 확인할 범위인 length를 전달받는다.
1. 만약 length가 1이면 이차원 배열의 해당 인덱스의 값을 '*'로 변경한다.
2. 아니라면 확인할 부분을 9 부분으로 나누고, 그 부분 중 중간을 제외하고 다시 함수를 실행시킨다.
3. 함수를 다시 실행시킬 때는 각 부분의 가장 왼 & 위쪽의 인덱스를 row, col로 전달하고, 현재의 length를 3으로 나눈 몫을 length로 전달한다.
# 2447
# 별 찍기 - 10
n = int(input())
graph = [[' '] * n for _ in range(n)]
def divide_and_get_star(row, col, length):
if length == 1:
graph[row][col] = '*'
return
next_length = length // 3
divide_and_get_star(row, col, next_length)
divide_and_get_star(row, col + next_length, next_length)
divide_and_get_star(row, col + next_length * 2, next_length)
divide_and_get_star(row + next_length, col, next_length)
divide_and_get_star(row + next_length, col + next_length * 2, next_length)
divide_and_get_star(row + next_length * 2, col, next_length)
divide_and_get_star(row + next_length * 2, col + next_length, next_length)
divide_and_get_star(row + next_length * 2, col + next_length * 2, next_length)
return
divide_and_get_star(0, 0, n)
for i in range(n):
for j in range(n):
print(graph[i][j], end="")
print()
처음에 출력할 때 모든 원소 사이에 띄어쓰기도 함께 출력해서 바로 통과하지 못 했었다.
'Python 알고리즘 공부 > 백준 알고리즘 공부' 카테고리의 다른 글
9935: 문자열 폭발 (python) (0) | 2023.03.23 |
---|---|
11718: 그대로 출력하기 (python) (0) | 2023.03.23 |
25501: 재귀의 귀재 (python) (0) | 2023.01.07 |
10870: 피보나치 수 5 (python) (0) | 2023.01.07 |
10872: 팩토리얼 (python) (0) | 2023.01.07 |
댓글