[알고리즘] 백준 1697 숨바꼭질 (파이썬 풀이)

728x90

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

 

1697번: 숨바꼭질

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일

www.acmicpc.net

해결코드

from collections import deque

def bfs():
    q = deque()
    q.append(n)
    while q:
        x = q.popleft()
        if x==k:
            print(dist[x])
            break
        for j in (x-1,x+1,x*2):
            if(0<=j<=MAX and not dist[j]):
                dist[j] = dist[x]+1
                q.append(j)
                
n,k = map(int, input().split())
MAX = 100000
dist = [0]*(MAX+1)
bfs()

문제풀이

bfs를 이용하여 해결할 수 있는 문제이다.

큐를 이용해야 하는데 파이썬에서 큐를 이용할 때는 deque을 사용하는게

시간초과에 안걸릴 수 있다.

 

코드를 보자

 

n,k = map(int, input().split())
MAX = 100000
dist = [0]*(MAX+1)

각자의 위치 n,k를 입력받아주고

문제에서 좌표의 최대값이 100000이라고 주어졌으니 MAX값을 100000으로 초기화한다.

dist라는 변수에는 MAX+1개의 0을 가진 리스트를 저장한다.

 

def bfs():
    q = deque()
    q.append(n)

bfs함수를 보면

q라는 덱하나를 생성해주고

n값을 추가해준다.


    while q:
        x = q.popleft()
        if x==k:
            print(dist[x])
            break

q의 원소가 있는동안 while문을 실행한다

q의 원소를 왼쪽에서 제거하고 x값에 저장한다.

만약 x와 k가 같다면(동생의 위치와 같다면)

dist[x]를 출력하고 멈춘다.


        for j in (x-1,x+1,x*2):
            if(0<=j<=MAX and not dist[j]):
                dist[j] = dist[x]+1
                q.append(j)

x-1,x+1,x*2의 값으로 for문을 실행시킨다(예를 들어 x=5이면 j=4,6,10)

만약 j가 0과 MAX값 사이의 값이고 dist[j]와 같지않다면

dist[j]는 dist[x]+1이다.(처음 dist[x]는 무조건 0이다) ex) dist[4,6,10]=0+1

그리고 j값을 q에 추가해준다. 

728x90

댓글