<BOJ>3190번: 뱀

라모스·2022년 3월 28일
0

BOJ

목록 보기
22/22
post-thumbnail

문제

접근

  • 최대한 단순하게 문제에서 주어진 규칙을 맞추려고 해보자.
  • 보드판 위에 사과는 1, 뱀이 위치한 곳은 2, 나머지는 0으로 생각하고 접근하자.
  • 뱀의 몸 길이에 관한 내용은 현재 위치와 다음 위치를 2로 만들고 주어진 조건에 따라 현재 위치를 0으로 바꿀지, 그대로 두고 다음 위치로 넘어갈지를 생각하면 된다.
  • 방향 변환을 위해 먼저 뱀이 움직일 때 마다 time을 카운팅한다.
  • 동, 남, 서, 북 순서로 방향 좌표를 만들어 두고, L인지 D인지에 따라 방향을 바꿀 수 있도록 함수를 정의하자.

내 코드

from collections import deque
dx = [0, 1, 0, -1] # 동, 남, 서, 북
dy = [1, 0, -1, 0]

def rotate(dir, c):
    if c == 'L':
        direction = (dir - 1) % 4
    else:
        direction = (dir + 1) % 4
    return direction

N = int(input())
board = [[0] * (N+1) for _ in range(N+1)] # (1, 1) 부터 (N, N) 까지

K = int(input())
for _ in range(K):
    row, col = map(int, input().split())
    board[row][col] = 1

L = int(input())
info = []
for _ in range(L):
    x, c = input().split() # X초, C방향(L or D)
    info.append((int(x), c))

time = 0
dir = 0
info_index = 0
x, y = 1, 1
board[x][y] = 2
queue = deque()
queue.append((x, y))
while True:
    nx = x + dx[dir]
    ny = y + dy[dir]
    if 1 <= nx <= N and 1 <= ny <= N and board[nx][ny] != 2:
        if board[nx][ny] == 0: # 사과 x
            board[nx][ny] = 2
            cur_x, cur_y = queue.popleft()
            board[cur_x][cur_y] = 0
            queue.append((nx, ny))
        if board[nx][ny] == 1:
            board[nx][ny] = 2
            queue.append((nx, ny))
    else:
        time += 1
        break
    x, y = nx, ny
    time += 1
    if info_index < L and info[info_index][0] == time:
        dir = rotate(dir, info[info_index][1])
        info_index += 1

print(time)
profile
Step by step goes a long way.

0개의 댓글