3190 뱀
업데이트:
1. 문제
문제는 링크에 들어가면 있다.
2. 정답 코드
문제의 내 정답 코드는 다음과 같다.
# 다 벽이다
# 뱀은 처음에 0,0에 위치하고, 길이는 1이다.
# 오른쪽으로 향한다 처음엔
import copy
N = int(input())
K = int(input())
graph = [[0 for _ in range(N)] for _ in range(N)]
for k in range(K): # 사과의 위치
temp =list(map(int,input().split()))
# 행,렬 로 주어짐
graph[temp[0]-1][temp[1]-1] = 1
L = int(input())
direction_list = dict()
for l in range(L):
temp =list(input().split())
# 행,렬 로 주어짐
direction_list[int(temp[0])]= temp[1]
# 우 하 좌 상 -> 0 1 2 3
dx = [1,0,-1,0]
dy = [0,1,0,-1]
from collections import deque
x,y= 0,0
snake_body = deque([[x,y]])
snake_direction = 0
def turn(snake_direction,direction):
if direction == "L":
snake_direction -= 1
else:
snake_direction += 1
return snake_direction % 4
time_constant = 0
while True :
time_constant += 1
# 시뮬레이션
# 1. 무조건 방향으로 머리가 한칸 움직인다.
y = snake_body[-1][0] + dy[snake_direction]
x = snake_body[-1][1] + dx[snake_direction]
# 4. 벽에 닿거나 자기몸에 닿으면 끝
if y < 0 or x < 0 or y >= N or x >= N or [y,x] in snake_body:
# 게임의 총 시간은?
print(time_constant)
break
# 2. 사과가 있으면 길이가 늘어난다.
if graph[y][x] == 1:
snake_body.append([y,x])
# 3. 사과가 없으면 길이는 늘어나지 않으니 꼬리가 한칸 땡겨져야한다.
# 이것은 큐로 규현.
else :
# 헤드만 추가하고 꼬리 자르기
snake_body.append([y,x])
snake_body.popleft()
# x초가 끝난 후 방향 돌리기
if time_constant in direction_list:
snake_direction = turn(snake_direction,direction_list[time_constant])
아래는 인터넷을 참고해서 바꾼 내 풀이이다.
# 다 벽이다
# 뱀은 처음에 0,0에 위치하고, 길이는 1이다.
# 오른쪽으로 향한다 처음엔
import copy
N = int(input())
K = int(input())
graph = [[0 for _ in range(N)] for _ in range(N)]
for k in range(K): # 사과의 위치
temp =list(map(int,input().split()))
# 행,렬 로 주어짐
graph[temp[0]-1][temp[1]-1] = 1
L = int(input())
direction_list = dict()
for l in range(L):
temp =list(input().split())
# 행,렬 로 주어짐
direction_list[int(temp[0])]= temp[1]
# 우 하 좌 상 -> 0 1 2 3
dx = [1,0,-1,0]
dy = [0,1,0,-1]
from collections import deque
x,y= 0,0
graph[y][x] = -1
snake_body = deque([[y,x]])
snake_direction = 0
def turn(snake_direction,direction):
if direction == "L":
snake_direction -= 1
else:
snake_direction += 1
return snake_direction % 4
time_constant = 0
while True :
time_constant += 1
# 시뮬레이션
# 1. 무조건 방향으로 머리가 한칸 움직인다.
y += dy[snake_direction]
x += dx[snake_direction]
# 4. 벽에 닿거나 자기몸에 닿으면 끝
if y < 0 or x < 0 or y >= N or x >= N or graph[y][x] == -1:
# 게임의 총 시간은?
print(time_constant)
break
else :
# 3. 사과가 없으면 길이는 늘어나지 않으니 꼬리가 한칸 땡겨져야한다.
if graph[y][x] != 1:
# 헤드만 추가하고 꼬리 자르기
temp_y,temp_x = snake_body.popleft()
graph[temp_y][temp_x] = 0
graph[y][x] = -1
snake_body.append([y,x])
# x초가 끝난 후 방향 돌리기
if time_constant in direction_list.keys():
snake_direction = turn(snake_direction,direction_list[time_constant])
3. 문제 풀이
이거 너무 억울하고 짜증나네 다른사람들하고 다른점은 graph에 뱀의 꼬리를 표현했냐 안했냐의 차이인데.. queue자체가 이미 뱀의 body를 표현하고있는거라 head와 body가 만나는지 묻는 조건문만 쓰면 되는거다. 근데 다른거 하나 없이 그냥 2중 리스트를 썼냐와 deque를 썼냐의 차이일 뿐인데 계속 내껀 답이 틀림..
앞으로 시뮬레이션이든 그리디든 뭐든.. 그래프에 뭔가 표현이 되거나 하는 문제는 항상 그래프에 값을 표시하면서 문제를 풀자. 이 문제만 2시간을 잡고있었네..참..