Java - 메모리: 21880 KB, 시간: 192 ms
C++ - 메모리: 3000 KB, 시간: 4 ms
0-1 너비 우선 탐색, 너비 우선 탐색, 데이크스트라, 그래프 이론, 그래프 탐색, 최단 경로
2024년 12월 20일 22:55:45
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 0초 후에 2*X의 위치로 이동하게 된다.
수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.
첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.
수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.
/**
* Author: yngbao97, Yuk Yejin
* Problem: 숨바꼭질 3_13549
* Date: 2024.12.20
*/
import java.util.*;
import java.lang.*;
import java.io.*;
public class Main {
static BufferedReader br;
static BufferedWriter bw;
static StringTokenizer st;
public static void main(String[] args) throws Exception {
br = new BufferedReader(new InputStreamReader(System.in));
bw = new BufferedWriter(new OutputStreamWriter(System.out));
int[] dp = new int[150_001];
Arrays.fill(dp, Integer.MAX_VALUE);
String[] input = br.readLine().split(" ");
int start = Integer.parseInt(input[0]);
int end = Integer.parseInt(input[1]);
PriorityQueue<Node> queue = new PriorityQueue<>();
queue.offer(new Node(start, 0));
dp[start] = 0;
while (!queue.isEmpty()) {
Node curr = queue.poll();
if (curr.num == end) break;
if (curr.num > 0 && dp[curr.num - 1] > curr.count + 1) {
dp[curr.num - 1] = curr.count + 1;
queue.add(new Node(curr.num - 1, dp[curr.num - 1]));
}
if (curr.num < 150_000 && dp[curr.num + 1] > curr.count + 1) {
dp[curr.num + 1] = curr.count + 1;
queue.add(new Node(curr.num + 1, dp[curr.num + 1]));
}
if (curr.num < 75_000 && dp[curr.num * 2] > curr.count) {
dp[curr.num * 2] = curr.count;
queue.add(new Node(curr.num * 2, dp[curr.num * 2]));
}
}
bw.write(String.valueOf(dp[end]));
bw.flush();
bw.close();
br.close();
}
}
class Node implements Comparable<Node> {
int num;
int count;
Node(int num, int count) {
this.num = num;
this.count = count;
}
@Override
public int compareTo (Node o) {
return Integer.compare(this.count, o.count);
}
}
/**
* Author: yngbao97, Yuk Yejin
* Problem: 숨바꼭질 3_13549
* Date: 2024.12.20
*/
#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
#include <climits>
#include <queue>
using namespace std;
struct compareCount {
bool operator() (const pair<int, int>& p1, const pair<int, int>& p2) {
return p1.second > p2.second;
}
};
int main() {
int start, end;
cin >> start >> end;
vector<int> dp(150001);
fill(dp.begin(), dp.end(), INT_MAX);
priority_queue<pair<int, int>, vector<pair<int, int> >, compareCount> pq;
pq.push(make_pair(start, 0));
dp[start] = 0;
while (!pq.empty()) {
pair<int, int> curr = pq.top();
pq.pop();
if (curr.first == end) break;
if (curr.first > 0 && dp[curr.first - 1] > curr.second + 1) {
dp[curr.first - 1] = curr.second + 1;
pq.push(make_pair(curr.first - 1, dp[curr.first - 1]));
}
if (curr.first < 150000 && dp[curr.first + 1] > curr.second + 1) {
dp[curr.first + 1] = curr.second + 1;
pq.push(make_pair(curr.first + 1, dp[curr.first + 1]));
}
if (curr.first < 75000 && dp[curr.first * 2] > curr.second) {
dp[curr.first * 2] = curr.second;
pq.push(make_pair(curr.first * 2, dp[curr.first * 2]));
}
}
cout << dp[end];
return 0;
}
pair<자료형, 자료형> 변수명 이고, 초기화는 make_pair(first, second) 로 한다.