백준 3190 뱀(with Python)
내가 생각한 Solution
문제에서 생각해볼 점
- 아래 그림처럼 제자리를 뱅뱅 돌 수 있는 경우가 있다고 생각했다.
-
하지만 뱀의 길이가 일시적으로 +1 되어 게임이 끝나는 경우에 해당한다. (Test case 3)
-
다행히 위의 테케가 주어져서 빨리 디버깅했다.
(뱅뱅 도는 것까지 고려하는 구현이 더 어렵다... 물론 2줄만 추가하면 되지만 ㅎㅎ) -
나머지 부분은 그리 어렵지 않으며 코드에 주석을 작성했으니 참고하시면 됩니다 :-)
코드 구현
import sys
from collections import deque
N = int(input())
K = int(input())
# 맵(brd)에 사과 표시
brd = [[0] * N for _ in range(N)]
for _ in range(K):
r, c = map(int, sys.stdin.readline().split())
brd[r-1][c-1] = 2
# 뱀의 이동 정보 저장
L = int(input())
snake_directions = deque([])
for _ in range(L):
sec, d = sys.stdin.readline().split()
snake_directions.append([int(sec), d])
NESW = [
[-1, 0],
[0, 1],
[1, 0],
[0, -1]
]
r, c = 0, 0
brd[r][c] = 1
snake = deque([[r, c]])
d = 1
t = 0
flag = False
while True:
# 조건 1. 이번에 뱀의 방향을 바꿔야하는 정보가 존재
# 조건 2. 뱀의 방향을 바꿔야하는 경우
if len(snake_directions) and snake_directions[0][0] == t:
_, tmp_d = snake_directions.popleft()
if tmp_d == 'D':
d = (d + 1) % 4
else:
d = (d + 3) % 4
r, c = snake[0]
dr, dc = NESW[d]
if 0 <= r + dr < N and 0 <= c + dc < N:
# 사과 먹은 경우
if brd[r + dr][c + dc] == 2:
snake.appendleft([r + dr, c + dc])
brd[r + dr][c + dc] = 1
else:
# 자기 몸통을 물어버린 경우...
if brd[r + dr][c + dc] == 1:
flag = True
pass
else:
# 꼬리가 다음 칸으로 옮겨질거라 빼버림
tail_r, tail_c = snake.pop()
# 맵에 해당 정보 기입
brd[tail_r][tail_c] = 0
# 머리가 움직였으니 appendleft로 머리 저장
snake.appendleft([r + dr, c + dc])
# 당연히 이것도 맵에 정보 기입
brd[r + dr][c + dc] = 1
# 벽에 부딪힌 경우...ㅜ
else:
flag = True
t += 1
if flag:
break
print(t)
Author And Source
이 문제에 관하여(백준 3190 뱀(with Python)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@daeungdaeung/백준-3190-뱀with-Python저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)