[BOJ] 13549번 | μˆ¨λ°”κΌ­μ§ˆ 3 (C++)

2023. 12. 6. 23:00ㆍCoding Test/BOJ

πŸ”—λ¬Έμ œ λ³΄λŸ¬κ°€κΈ°
 

13549번: μˆ¨λ°”κΌ­μ§ˆ 3

μˆ˜λΉˆμ΄λŠ” 동생과 μˆ¨λ°”κΌ­μ§ˆμ„ ν•˜κ³  μžˆλ‹€. μˆ˜λΉˆμ΄λŠ” ν˜„μž¬ 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 μžˆλ‹€. μˆ˜λΉˆμ΄λŠ” κ±·κ±°λ‚˜ μˆœκ°„μ΄λ™μ„ ν•  수 μžˆλ‹€. λ§Œμ•½, 수빈이의 μœ„μΉ˜κ°€ X일 λ•Œ

www.acmicpc.net

 

πŸ§‘‍πŸ’» 풀이 κ³Όμ •

 

μ΅œλ‹¨ 경둜 μ•Œκ³ λ¦¬μ¦˜μ„ μ—°μŠ΅ 쀑에 μžˆμ–΄, μ €λŠ” λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ ν’€μ—ˆμŠ΅λ‹ˆλ‹€. (λΉ„μš©μ— μŒμˆ˜κ°€ μ—†κΈ° λ•Œλ¬Έ)

μ‹œμž‘ μœ„μΉ˜λŠ” N, 도착 μœ„μΉ˜λŠ” K둜 μ£Όμ–΄μ§‘λ‹ˆλ‹€.

 

  1. Nμ—μ„œ i번째 λ…Έλ“œλ‘œ κ°€λŠ” 데에 λ“œλŠ” μ΅œμ†Œ μ‹œκ°„μ„ μ €μž₯ν•˜λŠ” λ°°μ—΄, timesλ₯Ό μ„ μ–Έν•©λ‹ˆλ‹€.
    λ²”μœ„κ°€ 0 ~ 100,000μ΄λ‹ˆ, 이 λ²”μœ„λ₯Ό 포함할 수 μžˆλŠ” 만큼의 크기둜 μ„ μ–Έ ν›„, λ¬΄ν•œλŒ€ κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€.
  2. times[N] = 0 으둜 μ΄ˆκΈ°ν™” ν›„, <μ‹œκ°„, λ…Έλ“œ> 정보λ₯Ό λ‹΄λŠ” μš°μ„ μˆœμœ„ 큐에 μ‹œμž‘μ  정보 <0, N>을 λ„£μŠ΅λ‹ˆλ‹€.
  3. 이동 κ·œμΉ™μ— 따라 -1, +1, *2λ₯Ό μ μš©ν•œ λ‹€μŒ μœ„μΉ˜(next)λ₯Ό κ³„μ‚°ν•˜κ³ , ν˜„μž¬ μ‹œκ°„μ—μ„œ λ‹€μŒ μœ„μΉ˜λ‘œ μ΄λ™ν•˜λŠ” 데 ν•„μš”ν•œ μ‹œκ°„(0 λ˜λŠ” 1)을 λ”ν•œ nextTime을 κ³„μ‚°ν•©λ‹ˆλ‹€.
    • nextTime이 기쑴에 next λ…Έλ“œλ‘œ μ΄λ™ν•˜λŠ” μ‹œκ°„λ³΄λ‹€ λ§Žλ‹€λ©΄, λ„˜μ–΄κ°‘λ‹ˆλ‹€.
  4. 기쑴에 next λ…Έλ“œλ‘œ μ΄λ™ν•˜λŠ” 데 κ±Έλ¦¬λŠ” μ‹œκ°„ vs ν˜„μž¬ λ…Έλ“œλ₯Ό κ²½μœ ν•΄μ„œ next λ…Έλ“œλ‘œ κ°€λŠ” μ‹œκ°„ 쀑에 μž‘μ€ 것을 times[next]에 λ„£κ³ , 큐에 이 정보λ₯Ό λ„£μŠ΅λ‹ˆλ‹€.
  5. λ§Œμ•½ next == K라면, times[K] = min(times[K], nextTime) 으둜 κ°±μ‹ ν•΄μ€λ‹ˆλ‹€.
  6. 큐가 빌 λ•ŒκΉŒμ§€, 3 ~ 5 과정을 λ°˜λ³΅ν•©λ‹ˆλ‹€.

 

✏️ μ†ŒμŠ€ μ½”λ“œ 및 κ²°κ³Ό

#include <iostream>
#include <vector>
#include <queue>

using namespace std;
#define FAST_IO ios::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL);
#define MAX 100000
#define INF 1000000000

int Calculate(int node, int i) {
    switch(i) {
        case 0: return node - 1;
        case 1: return node + 1;
        case 2: return node * 2;
    }
    return 0;
}

int FindMinTime(vector<int>& times, int start, int K) {
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    // <μ΅œμ†Œ μ‹œκ°„, λ…Έλ“œ>
    
    times[start] = 0;
    pq.emplace(0, start);

    while (!pq.empty()) {
        pair<int, int> current = pq.top();
        int time = current.first;
        int node = current.second;
        pq.pop();

        for (int i = 0; i < 3; i++) {
            int next = Calculate(node, i);

            if (next < 0 or next > MAX or times[next] < time)
                continue;

            bool isTeleport = (i == 2);
            int nextTime = time + !isTeleport;

            if (next == K)
                times[K] = min(nextTime, times[K]);

            if (nextTime < times[next]) {
                times[next] = nextTime;
                pq.emplace(nextTime, next);
            }
        }
    }

    return times[K];
}

int main() {
    FAST_IO
    int N, K;
    cin >> N >> K;

    vector<int> times(MAX + 1, INF);
    int answer = FindMinTime(times, N, K);
    cout << answer;
    return 0;
}

 

 

728x90
λ°˜μ‘ν˜•