DOTY
8) 백준 13549 - 숨바꼭질3 본문
728x90
반응형
13549번: 숨바꼭질 3
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일
www.acmicpc.net
뻘짓 하다가 시간만 쓴 문제
#include <bits/stdc++.h>
using namespace std;
int cost[100001];
int dij[100001];
int main(void) {
fill_n(cost, 100001, 100002);
fill_n(dij, 100001, 2);
vector<vector<pair<int, int>> > dij(100001);
int N, K;
cin >> N >> K;
dij[0].push_back(make_pair(1, 1)); // 0 -> 1
dij[1].push_back(make_pair(0, 1)); // 1 -> 0
dij[1].push_back(make_pair(2, 0)); // 1 -> 2 (순간이동이 더 빠름)
for(int i = 2; i < 100001; i++) {
dij[i].push_back(make_pair(i-1, 1));
if(i+1 < 100001) {
dij[i].push_back(make_pair(i+1, 1));
if(i*2 < 100001) {
dij[i].push_back(make_pair(i*2, 0));
}
}
}
cost[N] = 0;
// weight, vertex
priority_queue<pair<int, int>> q;
q.push(make_pair(-cost[N], N));
while(!q.empty()) {
int start_point_cost = q.top().first;
int start_point = q.top().second;
q.pop();
if(start_point == K) {
cout << cost[K] << endl;
break;
}
for(int i = 0; i < dij[start_point].size(); i++) {
// 도착지 cost > 출발지 cost + weight
if(cost[dij[start_point][i].first] > cost[start_point] + dij[start_point][i].second) {
cost[dij[start_point][i].first] = cost[start_point] + dij[start_point][i].second;
q.push(make_pair(-cost[dij[start_point][i].first], dij[start_point][i].first));
}
}
}
return 0;
}
다익스트라를 사용하여 풀었다.
처음에는 시간을 어떻게 체크하지 했는데 생각해보니 cost에 이미 적혀있는 걸 깨달았다. 😂
그리고 Priority_queue에서 push할 때 음수로 저장하는 것을 잊고 그냥 했다가 낭패....
에이
728x90
반응형
광고
광고
'Algorithm > Dynamic Programming' 카테고리의 다른 글
10) 프로그래머스 Lv.3 - 등굣길 (1) | 2023.02.23 |
---|---|
9) 백준 1238 - 파티 (0) | 2023.02.09 |
7) 백준 1916 - 최소비용 구하기 (0) | 2023.01.30 |
6) 백준 1753 - 최단경로 (0) | 2023.01.27 |
5) 백준 11052 - 카드 구매하기 (0) | 2020.12.04 |
Comments