728x90
문제 : https://www.acmicpc.net/problem/13549
풀이과정
현재 위치 (N) 에서 -> 목적지 (K) 까지 도달하는 가장 빠른 시간을 구하는 문제이다.
걸리는 시간, 즉 가중치가 1 또는 0 이므로 0-1너비우선탐색 을 사용하여 풀이할 수 있다.
풀이
1. 0초 후 2*X로 이동하는 것이 가능하기 때문에
너비우선탐색 시 2*X의 경우 push_front를 통해 가장 먼저 탐색할 수 있도록 한다.
2. 1초 후 X-1 또는 X+1 로 이동할 수 있으며, 0초보다 오래 걸리기 때문에
너비우선탐색 시 push_back을 통해 나중에 탐색하도록 한다.
위 과정을 반복하면 최소 시간을 구할 수 있다.
코드
#include <iostream>
#include <stdio.h>
#include <deque>
using namespace std;
int N,K;
int visited[100001];
deque < pair < int,int > > dq;
void solution(int start) {
visited[start] = 1;
dq.push_back({start,0});
while(!dq.empty()) {
int now = dq.front().first;
int dist = dq.front().second;
if(now == K) {
printf("%d\n",dist);
return;
}
dq.pop_front();
// x*2
if(now*2 <= 100000 && visited[now*2] == 0) {
dq.push_front({now*2,dist});
visited[now*2] = 1;
}
// x-1
if(now-1 >= 0 && visited[now-1] == 0) {
dq.push_back({now-1,dist+1});
visited[now-1] = 1;
}
// x+1
if(now+1 <= 100000 && visited[now+1] == 0) {
dq.push_back({now+1,dist+1});
visited[now+1] = 1;
}
}
}
int main() {
scanf("%d %d",&N,&K);
solution(N);
}
728x90
'algorithm' 카테고리의 다른 글
| 백준 17141 - 연구소 2 (0) | 2024.12.10 |
|---|---|
| 백준 4179 - 불! (C++) (0) | 2024.11.09 |
| 백준 7569 - 토마토 (0) | 2024.10.20 |
| 백준 11660 - 구간 합 구하기 5 (0) | 2024.10.06 |
| 백준 12865 - 평범한 배낭 (1) | 2024.09.23 |