https://www.acmicpc.net/problem/3190
from collections import deque
a,b = 0,0
d= 0
mi = 0
n = int(input())
k = int(input())
group = set()
for _ in range(k):
x,y = map(int,input().split())
group.add((x-1,y-1))
L = int(input())
X = []
C = []
for i in range(L):
x,c = input().split()
X.append(int(x))
C.append(c)
turns = dict(zip(X, C))
dx = [0,1,0,-1]
dy = [1,0,-1,0]
def dir(d):
dl = (d + 3)%4
dd = (d + 1)%4
return [dl,dd]
snake=[[0,0]]
q = deque(snake)
while True:
a += dx[d]
b += dy[d]
if a < 0 or a >= n or b < 0 or b >= n:
break
if [a,b] in q:
break
if (a,b) not in group:
q.popleft()
else:
group.remove((a,b))
q.append([a,b])
mi+=1
if mi in turns:
if turns[mi] == 'L':
d = dir(d)[0]
else:
d = dir(d)[1]
print(mi+1)
다양한 오류 맞닥드림.
런타임에러 (EOF error)
런타임에러 (value error)
컴파일에러 -> 괄호 빼서 생기고, n-1 -> n 등 길이 오류.
시간초과
런타임에러(EOF error)
계속된 EOF error..
이것은 불필요하게 뱀의 정보를 na, nb라는 새로운 변수로 업데이트하던 문제점을 수정하니 런타임에러로 바뀜.
na = a + dx[d]
nb = b + dy[d] 를
a = a + dx[d]
b = b + dy[d]
로 바꾸어서 해결했다.
컴파일 에러
) 빼먹음
런타임에러(value error)
if [a,b] not in group:
q.popleft()
else:
q.remove([a,b])
q.append([a,b])
mi+=1
if [a,b] not in group:
q.popleft()
else:
group.remove([a,b])
q.append([a,b])
mi+=1
q에서 remove가 아니라,
group(사과 위치에서) remove 했어야함.
시간초과 해결
방향전환 횟수 체크할 때,... for i in range(len(X))로 해서 불필요한 반복을 해야했던 것을
한번만 체크해주기 위해
각각X =[] , C=[] 으로 리스트로 append 해서 각각의 리스트로만 보관하던 사과 좌표 정보를
dict(zip(X,C)) 로 바꾸어, for문을 다 돌 필요 없이 같은 초에 대한 값만을 비교할 수 있도록
딕셔너리 처리해주었다.
그래서 불필요한 for문 필요없이, if구문만으로 키(초)에 해당하는 값('L'or'D'의 방향정보)를 확인하여 런타임 에러를 해결하였다.
turns = dict(zip(X, C))
...
if mi in turns:
if turns[mi] == 'L':
d = dir(d)[0]
else:
d = dir(d)[1]
또 시간초과 에러
사과 위치 좌표 정보를 group이라는 리스트안에 리스트로 이중 리스트로 표현해서 시간초과 났다.
그래서 해당 정보를 group =[] 이 아닌 group = set() 으로 바꾸어주어다. 그리고 append 대신 add를 사용하였다.
등등 사소한 오류.
사과 좌표. 1행 1열에는 사과가 없다는 것 토대로 , 사과 좌표가 인덱스로 0,0인 것과 달리, +1씩 되어 있다는거 알아야 했다.
group.append([x,y]) 를 group.add((x-1,y-1))로 좌표가 아닌 index 위치 정보로 저장해줘야 했다.
그래서 인풋으로 3 4 위치에 사과가 있다고 하는 것이
인덱스로는 2 3 에 있는 것이었던 것....
그리고 그 때 말한 것 처럼 벽에 부딪치는 경우가 max길이 말고 min 길이인 보다 작을 때도 처리 해줬어야 했음.
if a >= n or b >= n: --> 이면 a, b가 0보다 작아지는 경우를 체크하지 못함.
if a < 0 or a >= n or b < 0 or b >= n:
'Language > python' 카테고리의 다른 글
[파이썬] 백준 로봇청소기 문제 코드 정리. (0) | 2025.04.07 |
---|---|
[파이썬]list(input()), list(map(int,input().split())) 차이 (0) | 2025.04.07 |
deque와 list 차이 (0) | 2025.03.24 |