본문 바로가기

카테고리 없음

[백준 / Python] 1261_알고스팟 풀이

https://www.acmicpc.net/problem/1261

처음 문제를 보았을 때, 그냥 BFS로 풀면 되겠다 싶었다.

 

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from _collections import deque
 
m, n = map(int, input().split())
data = []
for _ in range(n):
    data.append(list(map(int, input())))
 
dx, dy = [-1100], [00-11]
 
 
def bfs():
    q = deque()
    q.append((00))
    distance = [[int(1e9for _ in range(m)] for _ in range(n)]
    distance[0][0= 0
    visited = [[False for _ in range(m)] for _ in range(n)]
    while q:
        pop_x, pop_y = q.popleft()
 
        for i in range(4):
            nx, ny = pop_x + dx[i], pop_y + dy[i]
            if 0 <= nx < n and 0 <= ny < m and distance[pop_x][pop_y] < distance[nx][ny] and visited[nx][ny] == False:
                if data[nx][ny] == 1:
                    distance[nx][ny] = min(distance[pop_x][pop_y] + 1, distance[nx][ny])
                else:
                    distance[nx][ny] = min(distance[pop_x][pop_y], distance[nx][ny])
                visited[nx][ny] = True
                q.append((nx, ny))
    print(distance[n-1][m-1])
 
 
bfs()
 
cs

이것이 처음 풀었을 때, 틀린 코드이다.

저 코드에서 visited를 빼면 답은 맞지만, 메모리 초과가 나서 오답처리가 된다.

그렇다고 visited을 추가하면 답이 틀린다.

 

이유는 다음과 같다.

visited로 방문처리를 해주었을 경우

더 짧은 거리가 나와도, 이미 방문 처리를 해버려서 최소 횟수를 구할 수 없다.

그렇다고 visited를 빼버린다면, 이미 처리된 곳도 너무 많이 q에 집어넣게 되어 메모리 초과가 나버린다.

 

 

그럼 어떻게 해야할까

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from _collections import deque
 
m, n = map(int, input().split())
data = []
for _ in range(n):
    data.append(list(map(int, input())))
 
dx, dy = [-1100], [00-11]
 
 
def bfs():
    q = deque()
    q.append((00))
    distance = [[int(1e9for _ in range(m)] for _ in range(n)]
    distance[0][0= 0
    visited = [[False for _ in range(m)] for _ in range(n)]
 
    while q:
        pop_x, pop_y = q.popleft()
 
        for i in range(4):
            nx, ny = pop_x + dx[i], pop_y + dy[i]
            if 0 <= nx < n and 0 <= ny < m and visited[nx][ny] == False:
                if data[nx][ny] == 1:
                    distance[nx][ny] = distance[pop_x][pop_y] + 1
                    q.append((nx, ny))
                else:
                    distance[nx][ny] = distance[pop_x][pop_y]
                    q.appendleft((nx, ny))
                visited[nx][ny] = True
    print(distance[n - 1][m - 1])
 
 
bfs()
 
cs

visited로 방문처리는 하되, q에 넣는 방법을 달리 해야 한다.

바로 현재 distance가 0이라면, 큐에 삽입할 떄 가장 우선순위로 넣는 것이다.

이렇게 되면 distance가 큰 것이 먼저 방문할 경우를 제외하게 되어 해결할 수 있다.