STUDY/Algorithm

[백준] 12851 숨바꼭질 2 python

sinawi95 2021. 3. 29. 20:25
728x90

www.acmicpc.net/problem/12851

 

12851번: 숨바꼭질 2

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

www.acmicpc.net

from collections import deque
n, k = map(int, input().split())
if n == k:
    print(0)
    print(1)
else:
    dp = [0] * 100001
    q = deque([n])
    dp[n] = 1
    size, depth, cnt = len(q), 0, 0
    if_chk = True
    limit = 100000
    result_val = 0
    while q:
        if cnt == size:
            cnt = 0
            size =len(q)
            depth += 1
        cnt += 1
        x = q.popleft()
        if 0 <= x - 1 and (dp[x - 1] == 0 or dp[x - 1] == dp[x] + 1):
            dp[x - 1] = dp[x] + 1
            q.append(x - 1)
            if x - 1 == k:
                result_val += 1
        if x + 1 <= 100000 and (dp[x + 1] == 0 or dp[x + 1] == dp[x] + 1):
            dp[x + 1] = dp[x] + 1
            q.append(x + 1)
            if x + 1 == k:
                result_val += 1
        if x <= 50000 and (dp[2 * x] == 0 or dp[x * 2] == dp[x] + 1):
            dp[2 * x] = dp[x] + 1
            q.append(2 * x)
            if x * 2 == k:
                result_val += 1
        if if_chk and dp[k]:
            if_chk = False
            limit = dp[k] - 1
        if depth >= limit:
            break
    # result = limit
    print(limit)
    print(result_val)

이전글과 같은문제인데 구해야할게 하나 더 생겼다.

최소이동으로 갈수 있는 방법의 갯수까지 알아야한다.

같은 문제여서 그대로 복사해서 사용했는데 뭔가더 돌아간듯한 느낌이다.

이전과 다른점은 dp에 값이 있어도 확인하는 조건이 추가되었다.

그리고 limit을 정해서 최소 거리를 찾게 되면 딱 depth 까지만 확인한다.


타인의 코드를 보니 time을 따로 잡고 dp로 주는 값을 그 곳까지 가는 경우의 수로 잡았다.

창을 꺼버려서 가져오긴 귀찮지만 속도도 빠르고 꽤 좋은 코드였다.

 

'STUDY > Algorithm' 카테고리의 다른 글

[백준] 1941 소문난 칠공주 python  (0) 2021.03.29
[백준] 2210 숫자판 점프 python  (0) 2021.03.29
[백준] 1697 숨바꼭질 python  (0) 2021.03.29
[백준] 2660 회장뽑기 python  (0) 2021.03.28
[백준] 2636 치즈 python  (0) 2021.03.28