0. 문제 링크
https://www.acmicpc.net/problem/3190
1. 풀이 방법
- 나는 맵에다가 직접 뱀의 몸을 그려서 해결하였다.
- 사과가 있는 곳은 0, 뱀이 있는 곳은 1, 빈 공간은 -1로 처리하였다.
- dict를 사용해서 특정 시간의 뱀의 위치 전환을 표시했다. -> 0~3까지의 인덱스로 관리하였음. R이면 인덱스 += 1
- 뱀의 머리가 방향을 전환했다 하더라도, 꼬리는 나중에 전환하므로, 꼬리의 방향 전환을 위한 tailMove를 추가로 생성해 준다.
- tailMove에는 특정 위치에서 꼬리가 다음번에 이동해야 할 방향을 의미하는데, 꼬리가 특정 위치에 있다면 방향을 바꿔서 이동해 준다.
- 위 과정을 조건에 반복하면 된다.
2. 코드
import sys
input = sys.stdin.readline
if __name__ == "__main__":
n = int(input())
maps = [[-1] * n for _ in range(n)]
maps[0][0] = 1 # snake
k = int(input())
for _ in range(k):
y, x = map(int, input().split())
maps[y - 1][x - 1] = 0 # 사과가 있음
move = dict()
l = int(input())
for _ in range(l):
sec, dir = input().split()
move[int(sec)] = 1 if dir == 'D' else - 1
tailMove = dict()
dir = [[0, 1], [1, 0], [0, -1], [-1, 0]]
headDir = 0
tailDir = 0
headY, headX = 0, 0
tailY, tailX = 0, 0
for sec in range(1, n ** 2):
headY += dir[headDir][0]
headX += dir[headDir][1]
if not(0 <= headY < n and 0 <= headX < n):
break
headDir = (headDir + move.get(sec, 0)) % 4
tailMove[(headY, headX)] = move.get(sec, 0)
flag = maps[headY][headX]
match flag:
case -1:
## no apple, no snake
maps[headY][headX] = 1 # 이제 뱀이 있음
maps[tailY][tailX] = -1 # 꼬리 제거
tailDir = (tailDir + tailMove.get((tailY, tailX), 0)) % 4 # 꼬리가 방향을 전환함
tailY += dir[tailDir][0]
tailX += dir[tailDir][1]
case 0:
## apple
maps[headY][headX] = 1 # 이제 뱀이 있음
case 1:
## snake
break
print(sec)
3. 마무리
'Computer Science > 알고리즘' 카테고리의 다른 글
[프로그래머스 - Python] 138476 - 귤 고르기 (1) | 2023.10.15 |
---|---|
[백준 - Python] 2638 - 치즈 (0) | 2023.10.15 |
[백준 - Python] 2637 - 장난감 조립 (2) | 2023.09.20 |
[백준 - Python] 1938 - 통나무 옮기기 (0) | 2023.09.20 |
[백준 - Python] 2109 - 순회강연 (0) | 2023.09.20 |