2025-02-11 22:41:02

 

최단거리인데 가중치를 곁들인 최단경로...

다익스트라로 풀릴지도 모르겠으나 일단 bfs문제로 보고왔기에 bfs로 푼다.

 

nm까지 가는 1을 최소한으로 만나는 경로의 1의 횟수를 세야한다.

 

from collections import deque
import sys

m,n=map(int,sys.stdin.readline().rstrip().split())
str_graph=[]
for i in range(n):
    str_graph.append(sys.stdin.readline().rstrip())
graph=[[0]*m for _ in range(n)]
for i in range(n):
    for j in range(m):
        graph[i][j]=ord(str_graph[i][j])-ord('0')

q=deque()
q.append([0,0])
visited=[[-1]*m for _ in range(n)]
visited[0][0]=0
dr=[-1,0,1,0]
dc=[0,1,0,-1]
while q:
    cur_row,cur_col=q.popleft()
    cost=visited[cur_row][cur_col]
    for i in range(4):
        if cur_row+dr[i]>=n or cur_row+dr[i]<0 or cur_col+dc[i]>=m or cur_col+dc[i]<0:
            continue
        if visited[cur_row+dr[i]][cur_col+dc[i]]==-1 or visited[cur_row+dr[i]][cur_col+dc[i]]>cost+graph[cur_row+dr[i]][cur_col+dc[i]]:
            q.append([cur_row+dr[i],cur_col+dc[i]])
            visited[cur_row+dr[i]][cur_col+dc[i]]=cost+graph[cur_row+dr[i]][cur_col+dc[i]]
print(visited[n-1][m-1])

이렇게 작성했다.

근데 할때마다 느끼는건데 이건 정석으로 푸는건 아닌것같다

 

 

이것도 appendleft가 가능하다고 한다. 왜지 순서가 보장이 안될수도 있지않나?

이해했다 상태가 두개일때는 appendleft를 해도 문제가 되지않는다. 상태의 개수가 그 이상이면 문제될수있다.

그러므로 상태의 개수가 2개이상일때는 다익스트라를 써야한다.

일단 코드를 조금 수정해주자

from collections import deque
import sys

m,n=map(int,sys.stdin.readline().rstrip().split())
str_graph=[]
for i in range(n):
    str_graph.append(sys.stdin.readline().rstrip())
graph=[[0]*m for _ in range(n)]
for i in range(n):
    for j in range(m):
        graph[i][j]=ord(str_graph[i][j])-ord('0')

q=deque()
q.append([0,0])
visited=[[-1]*m for _ in range(n)]
visited[0][0]=0
dr=[-1,0,1,0]
dc=[0,1,0,-1]
is_end=False
while q:
    cur_row,cur_col=q.popleft()
    cost=visited[cur_row][cur_col]
    for i in range(4):
        if cur_row+dr[i]>=n or cur_row+dr[i]<0 or cur_col+dc[i]>=m or cur_col+dc[i]<0:
            continue
        if visited[cur_row+dr[i]][cur_col+dc[i]]==-1 or visited[cur_row+dr[i]][cur_col+dc[i]]>cost+graph[cur_row+dr[i]][cur_col+dc[i]]:
            if graph[cur_row+dr[i]][cur_col+dc[i]]==0:
                q.appendleft([cur_row+dr[i],cur_col+dc[i]])
            else:
                q.append([cur_row+dr[i],cur_col+dc[i]])
            visited[cur_row+dr[i]][cur_col+dc[i]]=cost+graph[cur_row+dr[i]][cur_col+dc[i]]
        if cur_row+dr[i]==n-1 and cur_col+dc[i]==m-1:
            print(cost+graph[cur_row+dr[i]][cur_col+dc[i]])
            is_end=True
            break
    if is_end:
        break

뭐지

 

from collections import deque
import sys

m,n=map(int,sys.stdin.readline().rstrip().split())
str_graph=[]
for i in range(n):
    str_graph.append(sys.stdin.readline().rstrip())
graph=[[0]*m for _ in range(n)]
for i in range(n):
    for j in range(m):
        graph[i][j]=ord(str_graph[i][j])-ord('0')

q=deque()
q.append([0,0])
visited=[[-1]*m for _ in range(n)]
visited[0][0]=0
dr=[-1,0,1,0]
dc=[0,1,0,-1]
is_end=False
if n==1 and m==1:
    print(0)
else:
    while q:
        cur_row,cur_col=q.popleft()
        cost=visited[cur_row][cur_col]
        for i in range(4):
            if cur_row+dr[i]>=n or cur_row+dr[i]<0 or cur_col+dc[i]>=m or cur_col+dc[i]<0:
                continue
            if visited[cur_row+dr[i]][cur_col+dc[i]]==-1 or visited[cur_row+dr[i]][cur_col+dc[i]]>cost+graph[cur_row+dr[i]][cur_col+dc[i]]:
                if graph[cur_row+dr[i]][cur_col+dc[i]]==0:
                    q.appendleft([cur_row+dr[i],cur_col+dc[i]])
                else:
                    q.append([cur_row+dr[i],cur_col+dc[i]])
                visited[cur_row+dr[i]][cur_col+dc[i]]=cost+graph[cur_row+dr[i]][cur_col+dc[i]]
            if cur_row+dr[i]==n-1 and cur_col+dc[i]==m-1:
                print(cost+graph[cur_row+dr[i]][cur_col+dc[i]])
                is_end=True
                break
        if is_end:
            break

1x1을 처리하는 로직이없었다.

확실히 bfs라면 appendleft방식이 더 어울린다.

'IT > ps' 카테고리의 다른 글

백준 16953번 a->b  (0) 2025.02.12
백준 1991번 트리 순회  (0) 2025.02.11
백준 13549번 숨바꼭질 3  (0) 2025.02.11
백준 14226번 이모티콘  (0) 2025.02.11
백준 13913번 숨바꼭질 4  (0) 2025.02.11