https://www.acmicpc.net/problem/15685
- 구현
- 시뮬레이션
import sys
input = sys.stdin.readline
arr = [[0]*(101) for _ in range(101)]
dirs = {0: (0, 1), 1: (-1, 0), 2: (0, -1), 3: (1, 0)}
def dragon(g):
dragon_dir = []
while g >= 0:
# dragon_dir가 비어있는 경우 (시작)
if len(dragon_dir) == 0:
dragon_dir.append(d)
# dragon_dir 수정해주기
else:
dragon_dir = next_dragon_dir(dragon_dir)
g -= 1
return dragon_dir
def next_dragon_dir(dragon_dir):
new_dragon_dir = list(reversed(dragon_dir))
for i in range(len(new_dragon_dir)):
if new_dragon_dir[i] == 3:
new_dragon_dir[i] = 0
else:
new_dragon_dir[i] += 1
return dragon_dir + new_dragon_dir
def is_square(r, c):
# r, c에서 →, ↓, ← 방향을 검사했을 때
# 네 방향이 모두 1이면 1 * 1 정사각형의 네 꼭지점이 모두 커브의 일부
count = 1 # 일단 (r, c)가 1이므로 count 1로 시작한다
moves = [(0, 1), (1, 0), (0, -1)]
for move in moves:
n_r = r + move[0]
n_c = c + move[1]
if 0 <= n_r < 101 and 0 <= n_c < 101:
if arr[n_r][n_c] == 1:
count += 1
r = n_r
c = n_c
else:
return False
else:
return False
if count == 4:
return True
else:
return False
# x좌표가 arr에서의 col, y좌표가 arr에서의 row임에 유의한다
for _ in range(int(input().strip())):
col, row, d, g = map(int, input().split())
dragon_dir = dragon(g)
# (row, col)에서 시작해서 dragon_dir의 방향들로 이동하며
# arr을 1로 바꾸어간다
# 시작점
arr[row][col] = 1
for direction in dragon_dir:
d_row, d_col = dirs[direction]
n_row = row + d_row
n_col = col + d_col
arr[n_row][n_col] = 1
# update
row = n_row
col = n_col
ans = 0
for r in range(101):
for c in range(101):
if arr[r][c] == 1:
if is_square(r, c):
ans += 1
print(ans)
⬛ 2차원 리스트에 드래곤커브를 어떻게 표현할 것인가?
arr
에 드래곤 커브를 구성하는 점들을 표시한다.⬛ 드래곤 커브의 규칙
4 1 2 3
입력을 예로 들면0: →, 1: ↑, 2: ←, 3: ↓
= 0: (0, 1), 1: (-1, 0), 2: (0, -1), 3: (1, 0)
arr
상에 1을 표시해주면 드래곤 커브를 구성하는 점들을 표시할 수 있다.⬛ 네 꼭짓점이 모두 드래곤 커브의 일부인 것의 개수 구하기
(r, c+1), (r+1, c+1), (r+1, c)
이 모두 1이면 1 x 1 정사각형의 네 꼭지점이 모두 커브의 일부이다.처음 문제를 보고는 복잡하고 어려울거라고 생각했는데, 문제에서 주는 상황을 곧이곧대로 구현하는 것이 아니라 (e.g., 90도 회전시킨 다음 0세대 드래곤 커브의 끝 점에 붙이기, 선분그리기 등...) 단순화해서 필요한 부분만 구현하려고 하니 풀이 방향이 보였다.
필기 깔끔하네요! 덕분에 잘 배워갑니다~!