Hikenny25

1697 - 숨바꼭질 본문

baekjoon (solved.ac)/class 3 Solve

1697 - 숨바꼭질

hikenny 2022. 10. 31. 08:55

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

 

1697번: 숨바꼭질

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

www.acmicpc.net

 

 

- DP

- BFS

 

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

dp = [int(1e9)] * 200001
dp[n] = 0

if n == 0:
    dp[1] = 1
    dp[2] = 2
else:
    dp[n-1] = 1
    dp[n+1] = 1
    dp[2*n] = 1

if n >= k:
    print(n-k)
    exit()

for i in range(n+1, k+1):
    if i % 2 == 0:
        dp[i] = min(dp[i-1], dp[i+1], dp[i//2]) + 1
    else:
        dp[i] = min(dp[i-1], dp[i+1]) + 1

print(dp[k])

(DP, 오답)

 

from collections import deque

def bfs(start):
    q = deque([start])
    visited[start] = True
    v = n
    while v != k:
        v = q.pop()

        for i in [v-1, v+1, v*2]:
            if 0 <= i < 200001 and visited[i] == False:
                q.appendleft(i)
                visited[i] = True
                predecessor[i] = predecessor[v] + 1

    print(predecessor[k])

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

visited = [False] * 200001
predecessor = [0] * 200001

bfs(n)

(BFS, 정답)

 

처음 보고 DP식이 떠올라서 바로 코드짰는데 틀렸당..

 

원래 알고리즘 분류 안보는 편인데 DP로 세 번인가 제출해도 오답떠서 봤더니 BFS 문제였다

 

BFS 분류 보니 문제는 쉽게 풀렸다

 

 

문제를 처음 볼 때 DP로 푸는 문제인지 BFS로 푸는 문제인지 어떻게 구별하는건가 싶어 구글링했는데, DP는 기본적인 아이디어가 재귀적인 점화식이기 때문에, Ground case가 있어야 된다고 했다!

 

한마디로 재귀가 종료되는 케이스가 존재해야 DP로 풀 수 있다고 한다. 사실 잘 이해는 못 했는데.. 이번 문제는 값이 늘어날 수도 있고, 줄어들 수도 있어서 그런 거 가따~

 

+) 헉 아마 Top-down과 Bottom-up 둘 다 해당하지 않아서 일 것 같다.

'baekjoon (solved.ac) > class 3 Solve' 카테고리의 다른 글

1992 - 쿼드트리  (0) 2022.10.31
1389 - 케빈 베이컨의 6단계 법칙  (0) 2022.10.31
2178 - 미로 탐색  (0) 2022.10.30
17626 - Four Squares  (1) 2022.10.30
1780 - 종이의 개수  (0) 2022.10.30
Comments