1. 문제
2. 접근 방법
일단은 deque를 사용해서 구현했습니다.
사용한 함수는 move, isEnd, rotate가 있습니다.
move: 뱀을 이동시키는 함수
isEnd: 뱀이 board 영역을 벗어났을 때 혹은 자기 자신의 몸에 머리를 댔을 때
rotate: 회전할 때
1. 초기 위치인 (1, 1) -> board 기준 (0, 0)을 먼저 deque에 넣고 move함수를 실행
2. 일단 현재 회전해야하는지 확인
2-1. 회전해야한다면 rotate함수를 이용해 방향 바꿔주기
3. 이동할 곳(머리가 향하고 잇는 곳)은 갈 수 있는 곳인지 isEnd 함수를 이용해 확인
3-1. 갈 수 있다면 사과가 있는 곳인지 확인
3-1-1. 사과가 있는 곳이라면, 뱀의 머리만 늘리기(꼬리 자르기 ㄴㄴ)
3-1-2. 사과가 없는 곳이라면, 뱀의 머리는 늘리고, 꼬리는 자르기
3-2. 갈 수 없다면 return
3. 코드
python
from collections import deque
def isEnd(x, y):
global board
if x < 0 or x >= N or y < 0 or y >= N:
return True
elif board[y][x] == True and board[y][x] != 'apple':
return True
return False
def move():
global ans, now_dir
while q:
x, y = q[0]
if bam_dirs and ans == int(bam_dirs[0][0]):
now_dir = rotate(now_dir, bam_dirs[0][1])
bam_dirs.pop(0)
tx = x + dirs[now_dir][0]
ty = y + dirs[now_dir][1]
if not isEnd(tx, ty):
if board[ty][tx] != 'apple':
x, y = q.pop()
board[y][x] = False
q.appendleft((tx, ty))
board[ty][tx] = True
else:
return
ans += 1
def rotate(now_dir, direction):
if direction == "D":
return (now_dir + 1) % 4
elif direction == 'L':
return (now_dir-1) % 4
N = int(input())
K = int(input())
board = [[False]*N for _ in range(N)]
apples = [list(map(int, input().split())) for _ in range(K)]
for i in range(len(apples)):
ay = apples[i][0] - 1
ax = apples[i][1] - 1
board[ay][ax] = 'apple'
L = int(input())
bam_dirs = [list(map(str, input().split())) for _ in range(L)]
dirs = [(1, 0), (0, 1), (-1, 0), (0, -1)]
now_dir = 0
ans = 0
q = deque()
q.append((0, 0))
board[0][0] = True
move()
print(ans+1)
4. 마치며
몇 안되는 예전에 풀었던 문제 중 하나인데, 다 풀고 나서 예전에 짠 코드 보니까 이때는 함수로 안나누고 통으로 풀었네여
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
흠 ~!
더보기
예전 코드 보기
import sys
def isWall(x, y):
global now_snake
if x <= 0 or x > N or y <= 0 or y > N:
return False
elif [x, y] in now_snake:
return False
return True
N = int(sys.stdin.readline())
apple_lst = [list(map(int, sys.stdin.readline().split())) for i in range(int(sys.stdin.readline()))]
snake_dir = [list(sys.stdin.readline().split()) for i in range(int(sys.stdin.readline()))]
board = [[0] * (N+1) for _ in range(N+1)]
dir_lst = [[1, 0], [0, 1], [-1, 0], [0, -1]]
now_dir = 0
now_snake = [[1, 1]]
cnt = 0
while True:
if len(snake_dir) and int(snake_dir[0][0]) == cnt:
change_dir = snake_dir.pop(0)
if change_dir[1] == 'L':
now_dir = (now_dir + 3) % 4
else:
now_dir = (now_dir + 1) % 4
test_x = now_snake[-1][0] + dir_lst[now_dir][0]
test_y = now_snake[-1][1] + dir_lst[now_dir][1]
if isWall(test_x, test_y):
if not [test_y, test_x] in apple_lst:
now_snake.pop(0)
else:
apple_lst.remove([test_y, test_x])
now_snake.append([test_x, test_y])
cnt += 1
else:
print(cnt+1)
break
예전에도 사과 좌표 때문에 고생했던거 같은데, 이번에도 좌표가 (행, 열)이라는 걸 까먹고 (x, y)로 생각했다가 삽질좀 했슴다 ^-^