λ°±μ€€/Silver

[BOJ] 1697 : μˆ¨λ°”κΌ­μ§ˆ

Jaeguk 2022. 1. 20. 21:31
문제 링크

1697번: μˆ¨λ°”κΌ­μ§ˆ (acmicpc.net)

 

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

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

www.acmicpc.net

싀버라고 λ§Œλ§Œν•˜κ²Œ λ΄€λ‹€

풀이

BFSλ₯Ό ν™œμš©ν•œ 문제. μ•žμœΌλ‘œ ν•œ 칸을 κ°€λ“  λ’€λ‘œ ν•œ 칸을 κ°€λ“  μˆœκ°„μ΄λ™μ„ ν•˜λ“  μ‚¬μš©λ˜λŠ” μ‹œκ°„μ€ λ™μΌν•˜λ‹€.

큐λ₯Ό λ§Œλ“€μ–΄μ„œ μœ„μΉ˜μ™€ μ‹œκ°„μ„ μ €μž₯ν•˜λ €κ³  ν–ˆλ‹€.

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
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <climits>
#include <algorithm>
#include <tuple>
#include <cmath>
using namespace std;
typedef long long ll;
int N, K;
int main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> N >> K;
    queue<pair<intint>> q;
    q.push({ N, 0 });
 
    while (!q.empty()) {
        int now = q.front().first;
        int Time = q.front().second;
        q.pop();
        if (now == K) {
            cout << Time << "\n";
            break;
        }
        q.push({ now * 2, Time + 1 });
        q.push({ now + 1, Time + 1 });
        q.push({ now - 1, Time + 1 });
    }
    return 0;
}
 
 
cs

 

말 κ·ΈλŒ€λ‘œ BFS에 κΈ°μ΄ˆν•œ μ½”λ“œλ‹€. κ·Έλž¬λ”λ‹ˆ λ©”λͺ¨λ¦¬ 초과λ₯Ό λ§ˆμ£Όν–ˆλ‹€. μ‹œκ°„μ΄ˆκ³ΌλŠ” 자주 λ°›μ•˜μ–΄λ„ λ©”λͺ¨λ¦¬ μ΄ˆκ³ΌλŠ” 처음인 것 κ°™λ‹€.

μ•„λ§ˆ ν•œ 번 λŒλ•Œλ§ˆλ‹€ 큐에 3κ°œμ”© λ°€μ–΄λ„£μ–΄μ„œ 그런 것같닀. 무쑰건 λ°€μ–΄ λ„£λŠ”κ²Œ μ•„λ‹ˆλΌ μ˜ˆμ™Έλ₯Ό κ±Έμ–΄μ€˜μ•Ό ν•  것 κ°™λ‹€.

Time_mem μ΄λΌλŠ” 배열을 λ§Œλ“€μ–΄μ„œ κ·Έ μœ„μΉ˜κΉŒμ§€ κ°€λŠ”λ° κ±Έλ¦° μ‹œκ°„μ„ μ €μž₯ν–ˆλ‹€. λ§Œμ•½ 같은 μœ„μΉ˜μ— λ„λ‹¬ν–ˆμ„ λ•Œ κ±Έλ¦° μ‹œκ°„μ΄ 이미 μ €μž₯된 μ‹œκ°„λ³΄λ‹€ 크닀면 ꡳ이 큐에 λ‹€μŒ 경우λ₯Ό 밀어넣을 ν•„μš”κ°€ μ—†λ‹€. κ·Έ 경우 κ·Έλƒ₯ 큐에 더 λ„£μ§€μ•Šκ³  continue둜 λ„˜μ–΄κ°”λ‹€.

μ΄λ ‡κ²Œ ν–ˆλ”λ‹ˆ νλŠ” 쀄일 수 μžˆμ—ˆμ§€λ§Œ λ¬Έμ œκ°€ ν•˜λ‚˜ 더 μžˆμ—ˆλ‹€. now * 2 λ₯Ό 계속 ν•˜λ‹€λ³΄λ‹ˆ nowκ°€ λ¬΄ν•œνžˆ 컀질 수 μžˆμ—ˆλ‹€.

κ·Έλ ‡κ²Œ 되면 Time_mem의 λ²”μœ„λ₯Ό K의 λ²”μœ„λ‘œ μ§€μ •ν•΄λ†¨λŠ”λ° μ˜€λ²„ν”Œλ‘œμš°κ°€ λ‚˜κ²Œλœλ‹€. 또 μ‹œκ°„λ‚­λΉ„μ— λ©”λͺ¨λ¦¬ λ‚­λΉ„λ‹€.

now의 2λ°°κ°€ K의 2λ°°λ₯Ό λ„˜μ„ 수 μ—†λ‹€κ³  νŒλ‹¨ν–ˆλ‹€. μ™œλƒ now의 2λ°°κ°€ K의 2배보닀 ν¬κ±°λ‚˜ κ°™λ‹€λŠ” 건 κ·Έ 전에 이미 도달할 수 μžˆμ—ˆλ‹€λŠ” λœ»μ΄λ‹€. κ·Έλž˜μ„œ κ·Έ 경우 μ˜ˆμ™Έλ₯Ό 걸어쀬닀.

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
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <climits>
#include <algorithm>
#include <tuple>
#include <cmath>
using namespace std;
typedef long long ll;
int N, K;
int Time_mem[1000000 + 5];
int main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> N >> K;
    memset(Time_mem, -1sizeof(Time_mem));
    queue<pair<intint>> q;
    q.push({ N, 0 });
    while (!q.empty()) {
        int now = q.front().first;
        int Time = q.front().second;
        q.pop();
        if (now == K) {
            cout << Time << "\n";
            break;
        }
        if (Time_mem[now] != -1 && Time_mem[now] <= Time)
            continue;
        Time_mem[now] = Time;
        q.push({ now + 1, Time + 1 });
        q.push({ now - 1, Time + 1 });
        if (now * 2 >= K * 2)
            continue;
        q.push({ now * 2, Time + 1 });
    }
    return 0;
}
 
 
cs

κ·Έλ ‡κ²Œ κΉ”λ”ν•œ μ½”λ“œλŠ” μ•„λ‹Œ 것 κ°™μ§€λ§Œ μ•„λ¬΄νŠΌ λ§žμ•˜λ‹€.

 

 

728x90