[Python] 백준 / gold / 3190 : 뱀

김상우·2021년 12월 20일
0

문제 링크 : https://www.acmicpc.net/problem/3190

막학기 기말고사 시즌인데 하필 코로나를 걸려버려서 정신 없었다 ..
오랜만에 다시 PS 를 시작했다. 오늘이 월요일이어서 오히려 좋아.

학교 수업 때문에 C++ 만 사용하다가 오랜만에 Python 사용하니까 헷갈리긴 했는데 역시 난 파이썬이 좋다.

시뮬레이션 문제인데 요새 기업 코딩테스트 트렌드가 문제 이해 바탕으로 한 빡구현 문제들을 자주 출제하는 것 같아서 연습하기 좋은 문제였던거 같다.

내 로직에서는 time = 1 로 시작해야 됐던게 관건인 것 같고, 사과의 행 열 위치를 -1 씩 해줘야하는 함정을 조심해야 됐었다.

그리고 마지막 if 문에서 "if curve" 했던것처럼 리스트가 비어있지는 않은지 확인하는 습관을 들여야겠다.

파이썬 코드

import sys
from collections import deque
N = int(sys.stdin.readline())
K = int(sys.stdin.readline())

graph = [[0] * N for _ in range(N)]

# 사과 설정
for _ in range(K):
    x, y = map(int, sys.stdin.readline().split())
    graph[x-1][y-1] = 1

L = int(sys.stdin.readline())
curve = deque()
for _ in range(L):
    X, C = sys.stdin.readline().split()
    curve.append((int(X), C))

# 게임 시작
x = 0
y = 0
snake = deque([(0, 0)])
direction = [(0, 1), (1, 0), (0, -1), (-1, 0)] # 우 하 좌 상
time = 1
d = 0
graph[x][y] = -1 # 뱀

while True:
    #print('x y',x,y)
    nx = x + direction[d][0]
    ny = y + direction[d][1]

    # 맵 안에 들어온 경우
    if 0 <= nx < N and 0 <= ny < N:
        # 사과를 먹을 경우
        if graph[nx][ny] == 1:
            x = nx
            y = ny
            graph[nx][ny] = -1
            snake.append((nx, ny))
        # 사과를 안먹을 경우
        elif graph[nx][ny] == 0:
            x = nx
            y = ny
            graph[nx][ny] = -1
            snake.append((nx, ny))
            # 꼬리를 자름
            tail = snake[0]
            graph[tail[0]][tail[1]] = 0
            snake.popleft()

        # 자기 몸에 부딪힐 경우
        elif graph[nx][ny] == -1:
            print(time)
            break
    # 맵 밖에 나갈 경우
    else:
        print(time)
        break

    if curve and time == curve[0][0]:
        if curve[0][1] == 'L':
            d = (d-1) % 4
        elif curve[0][1] == 'D':
            d = (d+1) % 4
        curve.popleft()

    time += 1
profile
안녕하세요, iOS 와 알고리즘에 대한 글을 씁니다.

0개의 댓글