개발/algorithm

[백준 13549번] 숨바꼭질 3 - python

zzi_on2 2022. 2. 24. 14:24

문제 링크

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

풀이

- bfs 를 사용해서 풀었는데 틀렸다고 떴다.

- bfs를 사용하기 위해서는 모든 간선의 가중치가 동일해야한다는 전제 조건이 필요하기 때문이라고 한다. 

본 문제의 경우 x*2로 순간이동하는 경우는 가중치가 0이기 때문에 일반적인 bfs를 사용하면 안되고, 

가중치가 0인 간선에 연결된 정점의 경우 큐의 맨 뒤가 아닌 맨 앞에 넣어줘야 한다. 

따라서 단순한 bfs를 사용한 아래 코드는 틀린 코드이다.

# 틀린 코드 
from collections import deque 

def bfs(n):
  visited[n] = True

  q= deque()
  q.append((n,0))

  while q:
    x, cnt = q.popleft()

    if x == k:
      return cnt
      
    if 0 <= x-1 <= 100000 and not visited[x-1]:
      visited[x-1] = True
      q.append((x-1,cnt+1))
    if 0 <= x+1 <= 100000 and not visited[x+1]:
      visited[x+1] = True
      q.append((x+1,cnt+1))
    if 0 <= x*2 <= 100000 and not visited[x*2]:
      visited[x*2] = True
      q.append((x*2,cnt))

      
n, k = map(int,input().split())

visited = [False] * 100001
print(bfs(n))

- 아래 코드처럼 x*2로 이동할 경우 appendleft 로 큐에 삽입해주니 해결 

- 틀린 이유를 찾느라 시간이 오래 걸렸다. 

 from collections import deque 

def bfs(n):
  visited[n] = True

  q= deque()
  q.append((n,0))

  while q:
    x, cnt = q.popleft()

    if x == k:
      return cnt

    if 0 <= x*2 <= 100000 and not visited[x*2]:
      visited[x*2] = True
      q.appendleft((x*2,cnt))
    if 0 <= x-1 <= 100000 and not visited[x-1]:
      visited[x-1] = True
      q.append((x-1,cnt+1))
    if 0 <= x+1 <= 100000 and not visited[x+1]:
      visited[x+1] = True
      q.append((x+1,cnt+1))
    

      
n, k = map(int,input().split())

visited = [False] * 100001
print(bfs(n))