728x90
15685번: 드래곤 커브
첫째 줄에 드래곤 커브의 개수 N1≤N≤20이 주어진다. 둘째 줄부터 N개의 줄에는 드래곤 커브의 정보가 주어진다. 드래곤 커브의 정보는 네 정수 x, y, d, g로 이루어져 있다. x와 y는 드래곤 커
www.acmicpc.net
문제 설명
- 일정한 규칙에 따라 세대를 거듭해 성장하는 드레곤 커브를 구현하면 되는 구현 문제
- 드래곤 커브가 성장하는 규칙을 어떻게 구현할 지 생각해내는 것이 어려운 문제
고민한 부분
드래곤 커브가 성장하는 규칙은 K 세대의 커브의 끝 점을 기준으로 K 세대의 커브 전체를 시계 방향으로 90도 회전시켜 붙인 것이다.
- 이전 세대의 마지막 점부터 시작점까지 역순으로 이동해 온 경로의 역순으로 이동한 방향을 반시계 방향으로 90도 회전시켜 그에 맞게 커브를 성장시키면 된다. 아래 그림을 보면 이해하기 쉽다.
- 2세대 커브는 [우 상 좌 상]으로 이동하며 그려짐
- 3세대 커브는 2세대 커브가 그려진 순서의 역순 [상 좌 상 우]를 각각 반시계 방향으로 회전시킨 방향인 [좌 하 좌 상] 순서로 선분을 추가해준다.
- 세대가 거듭할 때 이런 식으로 누적된 경로를 역순으로 회전시킨 방향으로 이동하면 드래곤 커브가 완성된다.
- 아래
path_list
가 이런 기능을 구현하는 함수로 가장 중요하다.

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sys | |
# 방향은 우 상 좌 하 순서 | |
table = [[0]*101 for i in range101] | |
def path_listd,g: | |
path= [d] | |
for gen in rangeg: | |
for i in rangelen(path-1, -1, -1): | |
path.append(path[i]+1%4) ## 돌아가는 순서 잘못됨 | |
return path | |
def count_square: | |
global table | |
cnt = 0 | |
for r in range100: | |
for c in range100: | |
if (table[r][c] == 1 and | |
table[r+1][c] == 1 and | |
table[r][c+1] == 1 and | |
table[r+1][c+1] == 1): | |
cnt += 1 | |
return cnt | |
def plot_curvescurves: | |
global table | |
dr = [0,-1,0,1] | |
dc = [1,0,-1,0] | |
for c,r,d,g in curves: | |
path = path_listd,g | |
table[r][c] = 1 | |
for i in path: | |
r, c = r + dr[i], c + dc[i] | |
table[r][c] = 1 | |
if __name__ == '__main__': | |
turn_in = 1 | |
if turn_in ==0: | |
sys.stdio = open′testcase.txt′ | |
N = intsys.stdio.readline() | |
curves = [listmap(int,sys.stdio.readline(.split)) for i in rangeN] | |
else: | |
N = intsys.stdin.readline() | |
curves = [listmap(int,sys.stdin.readline(.split)) for i in rangeN] | |
plot_curvescurves | |
printcountsquare() |
Lesson learned
- BFS, DFS나 다이나믹 프로그래밍과 같이 특정한 방법을 알고 있어야 푸는 문제가 아닌 단순 구현 문제는 문제를 잘 읽고 그 조건을 구현하면 되기 때문에 틀리고 난 후에 명확하게 배울 수 있는 점을 찾기 어렵다.
- 지금까지 구현 문제를 풀며 반복되는 실수는 문제를 잘못 이해하거나 조건을 누락하며 읽는 실수를 많이 한다는 점이다.
- 규칙에 따라 방향을 바꾸는 경우 시계 방향, 반시계 방향을 헷갈리는 등의 실수를 자주하는 것을 깨달았다.
'알고리즘 공부 > 백준 문제풀이' 카테고리의 다른 글
[백준 python] 23288번 주사위 굴리기 2 0 | 2022.08.15 |
---|---|
[python 백준] 14890번 경사로 2 | 2022.08.07 |
[백준 python] 14501번 퇴사 0 | 2022.08.05 |
[백준 python] 14889번 스타트와 링크 0 | 2022.08.05 |
[백준 python] 14891번 톱니바퀴 0 | 2022.08.05 |