백준 3190 뱀

김민영·2022년 12월 30일
0

알고리즘

목록 보기
18/125

계획

  • 구현
  • map_lst를 만듦. 일반은 0, 사과 있으면 1
  • 방향을 0, 1, 2, 3으로 두고, dx, dy로 이동 계산
  • 뱀 길이는 queue로 처리
  • 사과 먹으면 먹은 자리는 0으로 바꾸고, 뱀은 append, popleft 함
  • 사과 없으면 이동
    • 꼬리가 줄어들기 전에 머리가 이동
    • 해당 위치에 몸통이 있는지 먼저 확인 후, append 진행
  • 처음 시작부터 시간이 X만큼 지난 후에 방향 전환
  • 자기랑 충돌 또는 맵 밖으로 나가면 게임 끝
  • 마지막 방향 전환까지 살았으면, 맵 끝으로 갈 때까지 직진
import sys
from collections import deque

sys.stdin = open("input.txt")
input = sys.stdin.readline
N = int(input())
K = int(input())
map_lst = []
for _ in range(N):
    map_lst.append([0] * N)
for _ in range(K):
    y, x = map(int, input().split())
    map_lst[y-1][x-1] = 1
    
queue = deque([[0, 0]])

direct = 0  # 보는 방향 0우 1하 2좌 3상
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]

time = 0
L = int(input())
for _ in range(L):
    X, C = input().split()
    X = int(X)

    for _ in range(X - time):
        time += 1
        # print("direct", direct, queue)
        if [queue[-1][0] + dx[direct], queue[-1][1] + dy[direct]] in queue:
            print(time)
            exit()

        queue.append([queue[-1][0] + dx[direct], queue[-1][1] + dy[direct]])

        if queue[-1][0] < 0 or queue[-1][1] < 0 or queue[-1][0] >= N or queue[-1][1] >= N:
            print(time)
            exit()
        if map_lst[queue[-1][1]][queue[-1][0]] == 1:  # 사과 먹으면
            map_lst[queue[-1][1]][queue[-1][0]] = 0
        else:
            queue.popleft()

    # 방향 전환
    if C == "D":
        direct = (direct + 1) % 4
    elif C == "L":
        direct = direct - 1
        if direct < 0:
            direct += 4
            
# 마지막 방향 전환 후 직진            
while True:
    time += 1
    queue.append([queue[-1][0] + dx[direct], queue[-1][1] + dy[direct]])
    if queue[-1][0] < 0 or queue[-1][1] < 0 or queue[-1][0] >= N or queue[-1][1] >= N:
        print(time)
        exit()
    if map_lst[queue[-1][1]][queue[-1][0]] == 1:  # 사과 먹으면
        map_lst[queue[-1][1]][queue[-1][0]] = 0
        continue
    a = queue.popleft()
    if a in queue:
        print(time)
        exit()
  • 사과 위치 인덱스가 0부터가 아닌 1부터 시작함
  • 사과 위치가 행, 열 순서로 주어짐
profile
노션에 1차 정리합니당 - https://cream-efraasia-f3c.notion.site/4fb02c0dc82e48358e67c61b7ce8ab36?v=

0개의 댓글