[PS] 백준#3190 / 뱀
알고리즘 문제 풀이
- 링크 : 뱀
- 해결 :
solved
- 시간복잡도 : O(n)
- 분류 :
구현
,덱
풀이 과정
- cnt를 증가시키면서 반복한다.
- 방향을 바꿔야하면 바꾼다.
- 현재 방향으로 한 칸 이동한다.
- 종료 조건이면 break
- 이동가능한 칸이면 deque에 해당 칸을 appendleft 한다.
- 사과가 있으면 pop을 하지 않는다. = 꼬리를 옮기지 않는다.
- 사과가 없으면 pop = 꼬리를 옮긴다.
- 1~5번을 반복하면서 while문이 종료되면 cnt를 출력한다.
메모
- 뱀이 위치하고 있는 좌표들을 저장하는 자료구조가 deque이다.
- 왼쪽이 머리(=appendleft) 오른쪽이 꼬리(=pop)
소스코드
N = int(input())
A = int(input())
apples = []
for _ in range(A):
pos = list(map(int, input().split()))
pos = list(map(lambda x : x-1, pos))
apples.append(pos)
L = int(input())
shifts = []
for shift in range(L):
sec, dir = input().split()
sec = int(sec)
shifts.append((sec, dir))
board = [[0]*N for _ in range(N)]
for a in apples:
board[a[0]][a[1]] = 1
D = 1
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
head = (0,0)
cnt = 0
from collections import deque
shifts = deque(shifts)
snake = deque([head])
while True :
if shifts:
if cnt == shifts[0][0]:
sec, dir = shifts.popleft()
if dir == 'L':
D -= 1
if D == -1 :
D = 3
if dir == 'D':
D += 1
if D == 4 :
D = 0
nx = head[0] + dx[D]
ny = head[1] + dy[D]
cnt += 1
if nx < 0 or nx >= N or ny < 0 or ny >= N :
break
if snake.count((nx, ny)) :
break
snake.appendleft((nx, ny))
if board[nx][ny] == 0 :
snake.pop()
if board[nx][ny] == 1 :
board[nx][ny] = 0
head = (nx, ny)
print(cnt)
Author And Source
이 문제에 관하여([PS] 백준#3190 / 뱀), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@su-ram/PS-백준3190-뱀저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)