백준 3190 뱀 파이썬

1 분 소요

백준 3190 뱀 풀이

접근방식

  1. deque를 이용해서 해결하기
  2. 필요한 정보들을 모두 입력받기
  3. 시간과 방향정보는 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

댓글남기기