Algorithm/μΈν”„λŸ°(inflearn)

[JavaScript/section 9] 05 - 솑아지 μ°ΎκΈ°

_μ„±ν˜Έ_ 2022. 11. 21. 16:25
728x90
λ°˜μ‘ν˜•

πŸ“Œ 05 - 솑아지 μ°ΎκΈ°(BFS : μƒλŒ€νŠΈλ¦¬νƒμƒ‰)

ν˜„μˆ˜λŠ” 솑아지λ₯Ό μžƒμ–΄λ²„λ Έλ‹€. λ‹€ν–‰νžˆ μ†‘μ•„μ§€μ—λŠ” μœ„μΉ˜μΆ”μ κΈ°κ°€ 달렀 μžˆλ‹€. ν˜„μˆ˜μ˜ μœ„μΉ˜μ™€ μ†‘μ•„μ§€μ˜ μœ„μΉ˜κ°€ μˆ˜μ§μ„ μƒμ˜ μ’Œν‘œ 점으둜 주어지면 ν˜„μˆ˜λŠ” ν˜„μž¬ μœ„μΉ˜μ—μ„œ μ†‘μ•„μ§€μ˜ μœ„μΉ˜κΉŒμ§€ λ‹€μŒκ³Ό 같은 λ°©λ²•μœΌλ‘œ μ΄λ™ν•œλ‹€. μ†‘μ•„μ§€λŠ” 움직이지 μ•Šκ³  μ œμžλ¦¬μ— μžˆλ‹€.

ν˜„μˆ˜λŠ” 슀카이 콩콩을 타고 κ°€λŠ”λ° ν•œ 번의 μ ν”„λ‘œ μ•žμœΌλ‘œ 1, λ’€λ‘œ 1, μ•žμœΌλ‘œ 5λ₯Ό 이동할 수 μžˆλ‹€. μ΅œμ†Œ λͺ‡ 번의 μ ν”„λ‘œ ν˜„μˆ˜κ°€ μ†‘μ•„μ§€μ˜ μœ„μΉ˜κΉŒμ§€ 갈 수 μžˆλŠ”μ§€ κ΅¬ν•˜λŠ” λ¬Έμ œμ΄λ‹€.

πŸ“ μž…λ ₯μ„€λͺ…
첫 λ²ˆμ§Έ μ€„에 ν˜„μˆ˜μ˜ μœ„μΉ˜ S와 μ†‘μ•„μ§€μ˜ μœ„μΉ˜ Eκ°€ μ£Όμ–΄μ§„λ‹€. μ§μ„ μ˜ μ’Œν‘œ μ μ€ 1λΆ€ν„° 10,000κΉŒμ§€μ΄λ‹€.

πŸ“ 좜λ ₯μ„€λͺ…
μ ν”„μ˜ μ΅œμ†ŒνšŸμˆ˜λ₯Ό κ΅¬ν•œλ‹€. 닡은 1 이상이닀.

 

문제λ₯Ό ν•΄μ„ν•˜λ©΄ ν˜„μˆ˜μ˜ μœ„μΉ˜(좜발 지점)μ—μ„œ μ†‘μ•„μ§€μ˜ μœ„μΉ˜(도착지점)κΉŒμ§€μ˜ μ΅œλ‹¨ 거리λ₯Ό κ΅¬ν•˜λŠ” λ¬Έμ œμ΄λ‹€. 즉, 두 λ…Έλ“œ μ‚¬μ΄μ˜ μ΅œλ‹¨ 경둜λ₯Ό κ΅¬ν•˜λŠ” λ¬Έμ œμ΄λ―€λ‘œ 넓이 μš°μ„  탐색(BFS)으둜 νƒμƒ‰ν•˜λŠ” 것이 μ’‹λ‹€. 

μ—¬λŸ¬ 갈래 쀑 λ¬΄ν•œν•œ 길이λ₯Ό κ°€μ§€λŠ” κ²½λ‘œκ°€ μ‘΄μž¬ν•˜κ³  탐색 λͺ©ν‘œκ°€ λ‹€λ₯Έ κ²½λ‘œμ— μ‘΄μž¬ν•˜λŠ” 경우 깊이 μš°μ„  탐색(DFS)으둜 탐색할 μ‹œμ—λŠ” λ¬΄ν•œν•œ 길이의 κ²½λ‘œμ—μ„œ μ˜μ›νžˆ μ’…λ£Œν•˜μ§€ λͺ»ν•˜μ§€λ§Œ, 넓이 μš°μ„  탐색(BFS)의 κ²½μš°λŠ” λͺ¨λ“  경둜λ₯Ό λ™μ‹œμ— μ§„ν–‰ν•˜κΈ° λ•Œλ¬Έμ— 탐색이 κ°€λŠ₯ν•˜λ‹€λŠ” νŠΉμ§•μ΄ μžˆλ‹€.

 

πŸ“ 풀이 방법

μ΄μ§„νŠΈλ¦¬ λ„“μ΄μš°μ„ νƒμƒ‰(BFS)의 과정을 λ¨Όμ € μ΄ν•΄ν•˜κ³  였면 μ’‹λ‹€.

문제 풀이 λ°©λ²•μ—λŠ” 2가지가 μžˆλŠ”λ° 두 번째 λ°©λ²•μ˜ 경우 트리의 λ ˆλ²¨μ„ μ΄μš©ν•œ 방법이닀. 첫 번째 λ°©λ²•μœΌλ‘œ 이해λ₯Ό ν•œ ν›„ 두 번째 방법도 μ°Έκ³ ν•΄μ„œ 보면 λœλ‹€.

x - ν˜„μž¬ μ’Œν‘œ, nx - λ‹€μŒμ— 이동할 μ’Œν‘œ, ch[x] - ν˜„μž¬ μ’Œν‘œμ— μ˜€κΈ°κΉŒμ§€ λͺ‡ 번 μ›€μ§μ˜€λŠ”μ§€μ— λŒ€ν•œ 값이 μ €μž₯

  • nxκ°€ μ†‘μ•„μ§€μ˜ μ’Œν‘œμ™€ κ°™λ‹€λ©΄ ch[x]에 + 1을 return ν•œλ‹€.
  • nxκ°€ μ†‘μ•„μ§€μ˜ μ’Œν‘œμ™€ 같지 μ•Šλ‹€λ©΄ nxκ°€ μ’Œν‘œμ—μ„œ λ²—μ–΄λ‚˜μ§€ μ•ŠλŠ”μ§€, μ΄λ™ν•œ 적이 μžˆλŠ” μ’Œν‘œμΈμ§€ ν™•μΈν•œ ν›„ 쑰건에 μ ν•©ν•˜λ©΄ 큐에 nxλ₯Ό μΆ”κ°€ν•œλ‹€. (μ΄λ™ν•œ 적이 μžˆλŠ” μ’Œν‘œλ‘œ μ΄λ™ν•˜λ©΄ μ΅œλ‹¨ κ²½λ‘œκ°€ μ•„λ‹˜)
// ν˜„μž¬ μ’Œν‘œμ— μ˜€κΈ°κΉŒμ§€ λͺ‡ 번 μ›€μ§μ˜€λŠ”μ§€μ— λŒ€ν•œ 값을 μ €μž₯ν•˜λŠ” 방법
function solution(s, e) {
  let answer = 0;
  const queue = [];
  const ch = Array.from({ length: 10001 }, () => 0);
  queue.push(s);

  while (queue.length) {
    const x = queue.shift();

    for (let nx of [x - 1, x + 1, x + 5]) {
      if (nx === e) return ch[x] + 1;
      if (nx > 0 && nx <= 10000 && ch[nx] === 0) {
        queue.push(nx);
        ch[nx] = ch[x] + 1;
      }
    }
  }

  return answer;
}

console.log(solution(8, 3));
// 트리의 λ ˆλ²¨μ„ μ΄μš©ν•œ 방법
function solution(s, e) {
  let answer = 0;
  let ch = Array.from({ length: 10001 }, () => 0);
  let queue = [];
  queue.push(s);
  ch[s] = 1;

  let L = 0;
  while (queue.length) {
    let len = queue.length;

    for (let i = 0; i < len; i++) {
      let x = queue.shift();
      
      for (let nx of [x - 1, x + 1, x + 5]) {
        if (nx === e) return L + 1;
        if (nx > 0 && nx <= 10000 && ch[nx] === 0) {
          ch[nx] = 1;
          queue.push(nx);
        }
      }
    }
    L++;
  }
  return answer;
}

console.log(solution(5, 14));