본문 바로가기
Language/python

[파이썬] 백준 뱀 문제 3190

by 딸기뚜왈기 2025. 4. 20.

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: