π‘λ¬Έμ λΆμ μμ½
- μλΉμ΄κ° νμ¬ μμΉ Nμ μκ³ , λμμ΄ μμΉ Kμ μλ€.
- μλΉμ΄λ 1μ΄λ§λ€ μΈ κ°μ§ λ°©λ²μΌλ‘ μ΄λν μ μλ€:
- ν μΉΈ μμΌλ‘ μ΄λ: N+1
- ν μΉΈ λ€λ‘ μ΄λ: Nβ1
- λ λ°°λ‘ μ΄λ: NΓ2
- μλΉμ΄κ° λμμ μμΉ KκΉμ§ κ°λ μ΅μ μκ°μ ꡬν΄μΌ νλ€.
- κ°μ€μΉκ° λμΌν κ·Έλνμμ μ΅λ¨ κ²½λ‘λ₯Ό ꡬνλ λ¬Έμ μ΄λ―λ‘ BFS(λλΉ μ°μ νμ)λ‘ ν μ μλ€.
π‘μκ³ λ¦¬μ¦ μ€κ³
- BFSλ₯Ό μ¬μ©νμ¬ μ΅λ¨ μκ°μ ꡬνλ€.
- BFSλ νμ¬ λ
Έλμμ κ° μ μλ λͺ¨λ λ
Έλλ₯Ό νμν ν, λ€μ λ λ²¨λ‘ λμ΄κ°κΈ° λλ¬Έμ, μ¬λ¬ κ²½λ‘ μ€μμ μ΅λ¨ κ²½λ‘λ₯Ό μ°Ύμμ£Όλ νΉμ±μ΄ μλ€.
- μλΉμ΄μ μμΉ Nμμ μμνμ¬, λ§€ μκ° κ° μ μλ μΈ κ°μ§ μμΉ(μμΌλ‘, λ€λ‘, λ λ°°)λ₯Ό λͺ¨λ νμ λ£μ΄ νμνλ€.
- λ°©λ¬Έν μμΉλ₯Ό κΈ°λ‘νμ¬ κ°μ μμΉλ₯Ό μ€λ³΅μΌλ‘ λ°©λ¬Ένμ§ μκ² νλ€.
- λͺ©ν μ§μ Kμ λλ¬νλ©΄ κ·ΈλκΉμ§ κ±Έλ¦° μκ°μ λ°ννλ€.
π‘μ½λ
const fs = require('fs');
const path = require('path');
const inputPath = path.join(__dirname, 'input.txt');
const input = fs.readFileSync(inputPath, 'utf-8').trim().split(' ');
// μ
λ ₯κ° νμ±
const [N, K] = input.map(Number);
// κ°μ΄ μ¬λ°λ₯΄κ² νμ±λμλμ§ νμΈ
if (isNaN(N) || isNaN(K)) {
console.error("μ
λ ₯ κ°μ΄ μλͺ»λμμ΅λλ€. Nκ³Ό Kλ₯Ό μ¬λ°λ₯΄κ² μ
λ ₯νμΈμ.");
process.exit(1);
}
function hideAndSeek(N, K) {
if (N === K) return 0; // μΆλ°μ κ³Ό λμ°©μ μ΄ κ°μΌλ©΄ 0μ΄
const visited = Array(100001).fill(false); // λ°©λ¬Έ μ¬λΆ μ²΄ν¬ λ°°μ΄
const queue = [[N, 0]]; // [νμ¬ μμΉ, κ±Έλ¦° μκ°]μ μ μ₯νλ ν
visited[N] = true; // μΆλ°μ λ°©λ¬Έ μ²λ¦¬
while (queue.length > 0) {
const [current, time] = queue.shift();
// μΈ κ°μ§ κ²½μ°λ₯Ό νμ
for (let next of [current - 1, current + 1, current * 2]) {
if (next === K) return time + 1; // λͺ©ν μ§μ μ λλ¬νλ©΄ μκ° λ°ν
// λ²μλ₯Ό λ²μ΄λμ§ μκ³ λ°©λ¬Ένμ§ μμ μμΉμΌ κ²½μ° νμ μΆκ°
if (next >= 0 && next <= 100000 && !visited[next]) {
visited[next] = true; // λ°©λ¬Έ μ²λ¦¬
queue.push([next, time + 1]); // νμ [μμΉ, μκ°] μΆκ°
}
}
}
}
console.log(hideAndSeek(N, K)); // κ²°κ³Ό μΆλ ₯
π‘μκ°λ³΅μ‘λ
- BFSμ μκ° λ³΅μ‘λλ O(V + E)
- μ¬κΈ°μ Vλ μ μ μ κ°μ, Eλ κ°μ μ κ°μ
- μ μ μ κ°μ V: μμΉλ μ΅λ 100,000κΉμ§μ΄λ―λ‘ μ΅λ 100,001κ°μ μ μ μ νμν μ μλ€.
- κ°μ μ κ°μ E: κ° μ μ μμ μ΅λ 3κ°μ μΈμ ν μ μ (μμΌλ‘, λ€λ‘, λ λ°°)μ΄ μλ€.
λ°λΌμ μκ° λ³΅μ‘λλ O(3V) β O(V)