[BOJ] 1697 : μ¨λ°κΌμ§
λ¬Έμ λ§ν¬
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<int, int>> 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, -1, sizeof(Time_mem));
queue<pair<int, int>> 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 |
κ·Έλ κ² κΉλν μ½λλ μλ κ² κ°μ§λ§ μλ¬΄νΌ λ§μλ€.