해리의 데브로그

(삼성 SW 기출) 백준 3190 - 뱀

|

문제

  • [삼성 SW 역량 테스트 기출 문제] 백준 3190 - 뱀
  • 문제링크

나의 코드

  • 기본적으로 델타 배열을 사용하되, 방향 전환이 요구 될 때, 변경되는 방향의 인덱스 값을 direction 배열에 저장시켜서 사용하였음 (왼쪽, 오른쪽 방향 순서로 배열에 저장)
  • 시간 별 방향 전환 정보는 Time_Table을 최대 크기로 선언하여 시간을 인덱스로 기준삼아 방향 전환 정보를 갖고 옴.
  • 뱀의 크기 및 이동 유무는 snack 배열을 토대로 pop 과 append를 적절히 사용하여 구현하였음.
# 종료 조건
def Check(y,x):
    # 맵 밖을 벗어나거나, 자기자신의 몸과 부딪히는 경우
    if y < 0  or y >= N or x < 0 or x >= N or MyMap[y][x] == 1:
        return True
    return False

N = int(input())
K = int(input())
MyMap = [[0]*N for _ in range(N)]

for i in range(K):
    y,x = map(int, input().split())
    MyMap[y-1][x-1] = 2
MyMap[0][0] = 1

L = int(input())
Time_Table = [-1] * 10000
for _ in range(L):
    idx, turn = input().split()
    idx = int(idx)
    if turn == 'L': turn = 0
    else: turn = 1
    Time_Table[idx] = turn

# 상 하 좌 우
dy = [-1, 1, 0, 0]
dx = [0, 0, -1, 1]

# 상 -> L:좌 / D: 우
# 하 -> L:우 / D: 좌
# 좌 -> L:하 / D: 상
# 우 -> L:상 / D: 하
direction = [[2, 3], [3, 2], [1, 0], [0, 1]]

current_dir_idx, time, y, x = 3, 0, 0, 0
snack = [[0,0]]
# 꼬리~머리 순서

while True:

    time += 1
    n_y = y + dy[current_dir_idx]
    n_x = x + dx[current_dir_idx]

    # 종료 조건 검증
    if Check(n_y, n_x):
        break

    # 사과가 있는 경우 => 꼬리 위치 불변 & 사과 좌표 값을 뱀으로 변경(좌표 추가)
    if MyMap[n_y][n_x] == 2:
        MyMap[n_y][n_x] = 1
        snack.append([n_y, n_x])

    # 사과가 없는 경우 => 꼬리 좌표 제거 & 이동한 좌표 추가
    elif MyMap[n_y][n_x] == 0:
        MyMap[n_y][n_x] = 1
        snack.append([n_y, n_x])
        delete_y, delete_x = snack.pop(0)
        MyMap[delete_y][delete_x] = 0
    # 시간 증가, 기준 좌표값 업데이트

    y, x = n_y, n_x

    # 시간이 끝난 후, 방향 전환 검증 & 방향 전환
    if Time_Table[time] != -1:
        current_dir_idx = direction[current_dir_idx][Time_Table[time]]

print(time)

Comments