Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 플로이드-워셜
- 브루트포스
- join
- 그래프 이론
- 크루스칼
- 다이나믹프로그래밍
- 자료구조
- DFS
- GROUP BY
- 구현
- 누적합
- 분할정복
- 다익스트라
- 시뮬레이션
- 투포인터
- MST
- 그리디
- 수학
- DP
- 재귀
- 그래프 탐색
- 서브쿼리
- 해시
- 다이나믹 프로그래밍
- 백트래킹
- 트리
- 다시
- BFS
- 우선순위큐
- 에라토스테네스의 체
Archives
- Today
- Total
기록하고 까먹지 말기
2447 본문
날짜 : 2023. 05. 08
사용 언어 : python
문제
코드
import sys
sys.setrecursionlimit(10**3)
n = int(sys.stdin.readline())
graph = [[True] * n for _ in range(n)]
def star(r, c, a, flag):
if a == 0:
return
#print(r, c, a)
if flag: # True -> 재귀적으로 돌림
for i in range(3):
for j in range(3):
if i == j == 1:
star(r + i * (a // 3), c + j * (a // 3), a // 3, False)
else:
star(r + i * (a // 3), c + j * (a // 3), a // 3, True)
else: # False -> 길이에 대해서 전부 False처리
for i in range(r, r + a):
for j in range(c, c + a):
graph[i][j] = False
return
star(0, 0, n, True)
for i in range(n):
for j in range(n):
if graph[i][j]:
print("*", end="")
else:
print(" ", end="")
print()
풀이
- 재귀를 활용하여 풀이한다.
- 기준 인덱스의 행, 열을 각각 r, c라고 가정할 때, 탐색 길이(a)를 기준으로 돌린다.
- 3의 제곱승으로 입력받았기 때문에, 3으로 나누어가면서 재귀를 돌리되, 정가운데의 경우에는 전부 공백으로 출력해야 하기 때문에 플래그를 False로 적용시켜 재귀한다.
- 플래그가 False인 경우에는 공백처리해야 하기 때문에 해당 범위를 전부 False로 처리한다.
알게된 점
- 재귀방식으로 출력하려고 했지만 개행의 측면에서 어떻게 해야 할 지 풀이방식이 떠오르지 않았다.
- 그래서 따로 리스트를 만들어 True/False처리로 풀이하는 것을 떠올렸고, 재귀를 통해 리스트 최신화 후, 이중 for문으로 True/False값에 따라 별찍기를 하도록 만들었다.
- 다만 파이썬 언어 특성상 메모리를 많이 잡아먹었기 때문에 재귀 제한을 설정하는 것이 중요했다.
참고 사이트
-