티스토리 뷰
[Python]2447번, 별 찍기-10, 재귀함수
Vagabund.Gni 2023. 4. 22. 18:34문제
재귀적인 패턴으로 별을 찍어 보자.
N이 3의 거듭제곱(3, 9, 27,...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.
크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.
***
* *
***
N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3) ×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다.
예를 들어 크기 27의 패턴은 예제 출력 1과 같다.
입력
첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 $N=3^{k}$이며, 이때 1 ≤ k < 8이다.
출력
첫째 줄부터 N번째 줄까지 별을 출력한다.
풀이
오랜 시간이 걸려서 풀었지만 풀어놓고도 잘 이해가 가지 않는 문제이다.
다른 재귀함수 문제들은 예상보다 간단한 것들 뿐이라서 잘 넘어갔는데..
솔직히 문제를 처음 봤을 땐 어떻게 재귀를 이용하라는 건지도 감이 오지 않았으니까.
해결책은 주어진 숫자의 크기만큼 2차원 배열을 만들어 빈칸으로 채운 뒤,
별을 찍을 곳의 인덱스만 별로 바꾸어주는 간단한 로직이다.
근데 디버그를 하면서 따라가지 않고 눈으로는 도저히 시뮬레이션이 안 되는 걸 보면
내 한계가 여기까지인가 보다..
하지만 적어도 외우기라도 하기 위해 일단 블로그에 올린다.
import sys
n = int(sys.stdin.readline().rstrip())
result = [[' '] * n for _ in range(n)]
def star(n, x, y):
if n == 1:
result[y][x] = '*'
return
m = n // 3
for dy in range(3):
for dx in range(3):
if dx == 1 and dy == 1:
continue
star(m, x + m * dx, y + m * dy)
star(n, 0, 0)
for i in result:
print(''.join(i))
마지막 print에 ''.join(i)을 쓴 이유는 이 외에 더 좋은 출력방법을 떠올리지 못했기 때문이다.
덕분에 조금 코드가 미워지긴 했지만, 재귀 로직 자체는 간결하게 완성한 것 같아 올려봄!
'Algorithm > [Java+Python+JavaScript]BackJoon' 카테고리의 다른 글
[Java+Python]10986번, 나머지 합 (0) | 2023.05.24 |
---|---|
[Java+Python]2559번, 수열 (0) | 2023.05.21 |
[Java+Python]11659번, 구간 합 구하기 4 (2) | 2023.05.20 |
[Python]25501번, 파이썬에서 전역변수 사용하기 (4) | 2023.04.20 |
[Python]5430번, AC함수, 덱 마지막 문제 (0) | 2023.04.19 |
[Python]1021번, 원형 큐 (0) | 2023.04.18 |
- Total
- Today
- Yesterday
- 세계여행
- 유럽
- 여행
- 파이썬
- 세계일주
- 스트림
- 알고리즘
- 맛집
- RX100M5
- 리스트
- 지지
- java
- 세모
- 유럽여행
- 동적계획법
- spring
- 자바
- 백준
- 면접 준비
- 기술면접
- 칼이사
- 중남미
- Backjoon
- 스프링
- Python
- 남미
- Algorithm
- a6000
- BOJ
- 야경
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |