반응형
https://www.acmicpc.net/problem/13549
13549번: 숨바꼭질 3
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일
www.acmicpc.net
[ 문제풀이 ]
dp를 이용해서 풀 수 있는 문제였습니다.
이동할 수 있는 방법은 -1, 1, *2 총 3개였습니다. 이때 *2로 이동할 때는 시간이 0의 시간이 걸리고, 나머지 이동 중에는 1의 시간이 걸립니다.
그렇다면 N보다 작거나 같은 칸으로 이동할 때는 무조건 한 칸에 1씩 걸리므로 dp [ i ] = N - i 가 됩니다.
나머지 경우에는 i가 짝수일 때 dp[ i + 1 ] + 1, dp [ i - 1 ] + 1, dp [ i / 2 ] 중 가장 작은 값을 선택하면 되고, 홀수일 때는 dp [ i + 1 ] + 1, dp [ i - 1 ] + 1 중 가장 작은 값을 선택하면 됩니다.
또한 순간이동 시 이동시간이 2이므로 각 노드에 도착했을 때 *2로 이동할 수 있는 모든 칸에 대하여 dp [ cur ] < dp [ next ] 일 경우에 dp [ next ] = dp [ cur ]로 바꿔주면 됩니다.
마지막으로 dp[ K ]를 출력합니다.
[ 소스 코드 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #include <iostream> using namespace std; int N, K; int dp[200001]; void tel(int num) { int cur = num; while (1) { num *= 2; if (num > 200001) { break; } if (dp[num] > dp[cur]) { dp[num] = dp[cur]; } } } int main() { cin >> N >> K; for (int i = 0; i < 200001; i++) { dp[i] = 987654321; } for (int i = 0; i < 200001; i++) { if (i <= N) { dp[i] = N - i; } else { if (i % 2 == 0) { dp[i] = min(min(dp[i - 1] + 1, dp[i + 1] + 1), dp[i / 2]); } else { dp[i] = min(dp[i - 1] + 1, dp[i + 1] + 1); } } if (i > 0) { tel(i); } } cout << dp[K]; } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 7662번 - 이중 우선순위 큐 (C++) (0) | 2022.06.17 |
---|---|
[ 백준 ] 1967번 - 트리의 지름 (C++) (0) | 2022.06.16 |
[ 백준 ] 9935번 - 문자열 폭발 (C++) (0) | 2022.06.14 |
[ 백준 ] 2638번 - 치즈 (C++) (0) | 2022.06.13 |
[ 백준 ] 13460번 - 구슬 탈출 2 (C++) (0) | 2022.06.12 |