백준 3190 뱀 파이썬
백준 3190 뱀 풀이
접근방식
- deque를 이용해서 해결하기
- 필요한 정보들을 모두 입력받기
- 시간과 방향정보는 dictionary 타입으로 저장하기
import sys
from collections import deque
input = lambda: sys.stdin.readline().rstrip()
# 보드 크기
n = int(input())
board = [[0 for _ in range(n)] for _ in range(n)]
# 사과 갯수
k = int(input())
for _ in range(k):
a, b = map(int, input().split())
# 사과 위치 2
board[a-1][b-1] = 2
# 방향 변환 횟수
l = int(input())
times = {}
for _ in range(l):
x, c = input().split()
times[int(x)] = c
# queue 선언
queue = deque()
# 시작값 설정
x, y = 0, 0
# 출발 위치 append시켜주기
queue.append((x, y))
# 최종 결과
t = 0
# 시작 방향은 오른쪽을 바라보고 있다
direction = 1
# 상(1),우(2),좌(3),하(4)
dr = [-1, 0, 1, 0]
dc = [0, 1, 0 , -1]
# 방향 전환 함수
def change(c):
global direction
if c == 'L':
direction = (direction-1) % 4
else:
direction = (direction+1) % 4
while True:
t += 1
x += dr[direction]
y += dc[direction]
# 벽과 부딪힐 경우 break
if x < 0 or x >= n or y < 0 or y >= n:
break
# 사과가 있을 경우
if board[x][y] == 2:
board[x][y] = 1
queue.append((x, y))
# 사과가 있고, 방향을 바꿔야할 시간일 경우
if t in times:
change(times[t])
# 빈 공간일 경우
elif board[x][y] == 0:
board[x][y] = 1
queue.append((x, y))
# 이전에 방문한 위치는 다시 0으로 초기화
tx, ty = queue.popleft()
board[tx][ty] = 0
if t in times:
change(times[t])
else:
break
print(t)
이번 뱀 문제는 골드 5 수준의 구현 문제입니다.
이 문제는 뱀의 길이를 늘려주는 경우와 방향을 전환시켜주는 경우를
해결했느냐에 따라 정답여부가 달라질 것 같습니다.
또한 dictionary 형태로 방향 정보를 입력받는 것도 좋은 팁인 것 같습니다.
알고리즘도 모든 것과 마찬가지로 꾸준한 연습과 이해를 바탕으로 실력이 향상합니다.
Just do it & Keep steady
댓글남기기