티스토리 뷰

문제

https://www.acmicpc.net/problem/3190

 

3190번: 뱀

 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임

www.acmicpc.net

풀이

전형적인 시뮬레이션 문제이다. 제시된 조건을 하나하나 구현해나가면 해결할 수 있다.

 

지나간 자리의 몸통은 deque에 넣어주었고 사과가 없으면 popleft()를 통해 꺼내 주었다.

 

뱀의 머리가 벽에 닿았거나 뱀의 몸통에 닿을 때(deque에 현재 좌표가 이미 존재할 때) 종료 조건을 설정했다.

 

처음에 방향 전환 조건을 매 초가 시작될 때로 설정해 주어서 틀렸는데, 문제를 자세히 보니 매 초가 종료될 때 바꿔야 했었다.

코드

from collections import deque

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

K = int(input())
for _ in range(K):
    r, c = map(int, input().split())
    graph[r - 1][c - 1] = 1

L = int(input())
operations = {int(a): b for a, b in [list(input().split()) for _ in range(L)]}

dx = [0, 1, 0, -1]  # 동 남 서 북
dy = [1, 0, -1, 0]  # 동 남 서 북

d = 0  # 초기 방향 설정
x, y = 0, 0  # 초기 좌표 설정
cnt = 1
snake = deque([(x, y)])

while True:
    # 규칙 1
    nx = x + dx[d]
    ny = y + dy[d]
    if nx < 0 or nx >= N or ny < 0 or ny >= N:
        break
    elif (nx, ny) in snake:
        break
    else:
        x, y = nx, ny
        snake.append((x, y))

        # 규칙 2
        if graph[x][y] == 1:
            graph[x][y] = 0
        # 규칙 3
        else:
            snake.popleft()

    if cnt in operations:
        if operations[cnt] == 'L':
            d = (d + 3) % 4
        elif operations[cnt] == 'D':
            d = (d + 1) % 4
    cnt += 1

print(cnt)

'Problem Solving > 백준' 카테고리의 다른 글

백준 1005번 파이썬  (0) 2022.09.12
백준 10026번 파이썬  (0) 2022.07.03
백준 2263번 파이썬  (0) 2022.07.01
백준 4256번 파이썬  (0) 2022.06.30
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
글 보관함