https://www.acmicpc.net/problem/3190
뱀이 움직이는 걸 표현하는 문제입니다.
여기서 구현할 포인트는
뱀의 몸통과
이동시의 뱀의 몸통입니다.
저는 이걸 구현하기 위해
deque의 appendleft와 pop을 사용했습니다.
deque에서 맨 앞이 머리쪽이고
맨 뒤가 꼬리라고 놓고 생각했습니다.
문제를 읽어보면
사과가 있으면
머리만 움직이고
사과가 없으면
꼬리가 위치한 칸을 비워준다고 되있습니다.
사과가 있던 없던
움직이면 deque앞에
appendleft로 이동칸을 추가하되
사과가 없다면
pop()으로 꼬리를 제거했습니다.
그리고 이동전에는
현재 이동하는 위치가
뱀의 몸통과 이어있는지 판단했습니다.
코드를 보겠습니다.
# 백준 3190 뱀
from collections import deque
N = int(input())
room = [[0] * N for _ in range(N)]
K = int(input())
for _ in range(K):
x, y = map(int, input().split())
room[x - 1][y - 1] = 1
move = []
L = int(input())
for _ in range(L):
x, y = input().split()
move.append([int(x), y])
dx = [0, -1, 0, 1]
dy = [1, 0, -1, 0]
direct = 0
head = [0, 0]
body = deque()
body.append([head])
turn = 0
while turn <= 10000:
# 턴을 만족할 때 뱀이 턴
if move:
if move[0][0] == turn:
if move[0][1] == 'D':
direct = (direct - 1) % 4
elif move[0][1] == 'L':
direct = (direct + 1) % 4
move.pop(0)
nx, ny = head
nx += dx[direct]
ny += dy[direct]
# 벽을 부딪히면 이동종료
if nx < 0 or nx >= N or ny < 0 or ny >= N:
# print("wall")
turn += 1
break
# 움직인 곳에 사과가 있다면 몸이 늘어난다
if room[nx][ny] == 1:
body.appendleft([nx, ny])
room[nx][ny] = 0
# 사과가 없다면 몸통이 이동한다
else:
# 몸통이랑 부딪히면 종료
if [nx, ny] in body:
# print("body")
turn += 1
break
body.appendleft([nx, ny])
body.pop()
head = [nx, ny]
turn += 1
# print(head)
# print(room)
# print(body)
print(turn)
문제에서 다소 헷갈리는 포인트는
break하면서 turn+1해주는 것입니다.
벽이랑 부딪히든
몸통이랑 부딪히든
어찌되었든 움직인 거니
1초 반영이 된 것이죠.
appendleft에 대해서 배울 수 있었던
좋은 문제였습니다.
[백준 15684번] 사다리조작(파이썬) (0) | 2022.04.05 |
---|---|
[백준 17142번] 연구소3 (파이썬) (0) | 2022.04.04 |
[백준 15683번] 감시(파이썬) (0) | 2022.04.03 |
[백준 17825번] 주사위 윷놀이(파이썬) (0) | 2022.04.02 |
[백준 21609번] 상어중학교(파이썬) (1) | 2022.03.31 |
댓글 영역