λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm/μΈν”„λŸ°(inflearn)

[ μžλ°”μŠ€ν¬λ¦½νŠΈ(JavaScript) ] section09 - 5 - 솑아지 μ°ΎκΈ°(BFS: μƒνƒœνŠΈλ¦¬νƒμƒ‰)

by YWTechIT 2021. 10. 12.
728x90

πŸ“ section09 - 5 - 솑아지 μ°ΎκΈ°(BFS: μƒνƒœνŠΈλ¦¬νƒμƒ‰)

문제: ν˜„μˆ˜μ˜ μœ„μΉ˜μ™€ μ†‘μ•„μ§€μ˜ μœ„μΉ˜κ°€ μˆ˜μ§μ„  μƒμ˜ μ’Œν‘œ 점으둜 주어지면 ν˜„μˆ˜λŠ” ν˜„μž¬ μœ„μΉ˜μ—μ„œ μ†‘μ•„μ§€μ˜ μœ„μΉ˜κΉŒμ§€ λ‹€μŒκ³Ό 같은 λ°©λ²•μœΌλ‘œ μ΄λ™ν•œλ‹€. μ†‘μ•„μ§€λŠ” 움직이지 μ•Šκ³  μ œμžλ¦¬μ— μžˆλ‹€. ν˜„μˆ˜λŠ” ν•œ 번의 μ ν”„λ‘œ μ•žμœΌλ‘œ 1, λ’€λ‘œ 1, μ•žμœΌλ‘œ 5λ₯Ό 이동할 수 μžˆλ‹€. μ΅œμ†Œ λͺ‡ 번의 μ ν”„λ‘œ ν˜„μˆ˜κ°€ μ†‘μ•„μ§€μ˜ μœ„μΉ˜κΉŒμ§€ 갈 수 μžˆλŠ”μ§€ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ„Έμš”.

 

BFSλ₯Ό μ‚¬μš©ν•˜λŠ” 문제인데, μ™œ BFSλ₯Ό μ‚¬μš©ν•˜λŠ”μ§€ κ°•μ˜λ₯Ό 톡해 배울 수 μžˆμ—ˆλ‹€. 결둠적으둜 μƒνƒœ 트리, 레벨 트리λ₯Ό μ‚΄νŽ΄λ³΄λ©΄μ„œ 깊이 μš°μ„  탐색인 DFS처럼 ν•œ level만 λκΉŒμ§€ νŒŒκ³ λ“€λ©° targetκ³Ό 동일할 λ•ŒκΉŒμ§€ νƒμƒ‰ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, ν•œ λ ˆλ²¨μ—μ„œ 이동할 수 μžˆλŠ” μ’Œν‘œλ₯Ό μ‚΄νŽ΄λ³΄κ³  targetν•˜κ³  λ‹€λ₯΄λ©΄ λ‹€μŒ λ ˆλ²¨μ„ μ‚΄νŽ΄λ³΄κ³  (λ¬΄ν•œλ°˜λ³΅..) 이런 μ‹μœΌλ‘œ 넓이 μš°μ„  νƒμƒ‰μœΌλ‘œ ν‘ΈλŠ” 방법이 μ§€κΈˆ λ¬Έμ œμ™€ μ•Œλ§žλ‹€. μ—¬λ‹΄μœΌλ‘œ 이 λ°©λ²•μœΌλ‘œ λ°±μ€€1697 - μˆ¨λ°”κΌ­μ§ˆμ„ ν’€ 수 μžˆμœΌλ‹ˆκΉŒ 이 문제λ₯Ό ν’€κ³  λ‚˜μ„œ ν•œλ²ˆ λ„μ „ν•΄λ³΄μž.

 

  1. BFSλ₯Ό μ΄μš©ν•˜μ—¬ 레벨 탐색, μƒνƒœ 트리 탐색을 μ΄μš©ν•œλ‹€.
  2. ν˜„μž¬ queueμ—μ„œ 이동할 수 μžˆλŠ” μƒˆλ‘œμš΄ μ’Œν‘œ(nv)λ₯Ό λ‹€μ‹œ queue에 넣을 λ•Œ targetκ³Ό 같은지 ν™•μΈν•˜λŠ” 방법이 queueμ—μ„œ shift ν•  λ•Œ target을 ν™•μΈν•˜λŠ” 방법보닀 μ‹€ν–‰μ‹œκ°„μ„ μ‘°κΈˆμ΄λΌλ„ 더 λ‹¨μΆ•μ‹œν‚¬ 수 μžˆλ‹€.
  3. nv>0 && nv=10000을 ν•œ μ΄μœ λŠ” μ’Œν‘œκ°€ 1λΆ€ν„° 10000κΉŒμ§€λ‘œ μ •ν•΄μ Έ 있기 λ•Œλ¬Έμ— λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜μ§€ μ•Šλ„λ‘ ν•˜κΈ° μœ„ν•¨μ΄λ‹€.
  4. visited 배열을 μ„ μ–Έν•΄ 이미 ν•œλ²ˆ νƒμƒ‰ν•œ μ’Œν‘œλŠ” μƒˆλ‘œμš΄ μ’Œν‘œλ‘œ μ΄λ™ν•˜μ§€ λͺ»ν•˜κ²Œ μ„€μ •ν–ˆλ‹€.(visitedλ₯Ό μ„ μ–Έν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ λ˜‘κ°™μ€ μ’Œν‘œλ‘œ 이동할 것이고 μ΄λŠ” 뢈 ν•„μš”ν•œ μ—°μ‚°μœΌλ‘œ 이어진닀.)
  5. ν•˜λ‹¨μ˜ μ‚¬μ§„μ²˜λŸΌ μƒνƒœ 트리 탐색은 level을 μš°μ„ μ μœΌλ‘œ νƒμƒ‰ν•˜λŠ” 것이기 λ•Œλ¬Έμ— λ°©ν–₯은 μƒν•˜κ°€ μ•„λ‹Œ 쒌우둜 μ§„ν–‰λœλ‹€.
  6. ν•˜λ‹¨μ˜ μ½”λ“œλŠ” 2번 방법을 λΉ„κ΅ν•˜κΈ° μœ„ν•΄ μž‘μ„±ν•œ μ½”λ“œμΈλ°, μƒˆλ‘œμš΄ μ’Œν‘œλ₯Ό λ‹€μ‹œ queue에 넣을 λ•Œ μ—°μ‚° νšŸμˆ˜κ°€ μ λ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.

 

 

728x90

 

// μƒˆλ‘œμš΄ μ’Œν‘œμ—μ„œ target 확인
let s = 5;
let target = 14;

console.log(solution(s, target));

function solution(s, target){
  let visited = Array.from({length: target+1}, () => 0);
  let queue=[];

  visited[s] = 1;
  queue.push([s, 0]);

  while(queue.length){
    let [v, p] = queue.shift();
        console.log(`v=${v}, p=${p}`)

    for(let x of [v-1, v+1, v+5]){
      if (x === target) return p+1;
      if (!visited[x] && x >= 1 && x <= 10000){
        visited[x]=1;
        queue.push([x, p+1]);
      }
    }
  }
}

πŸ‘‰πŸ½
v=5, p=0
v=4, p=1
v=6, p=1
v=10, p=1
v=3, p=2
v=9, p=2
3

 

// queueμ—μ„œ λ‚˜μ€‘μ— μ’Œν‘œ 확인
let s = 5;
let position = 14;

console.log(solution(s, position));

function solution(s, position){
  let visited = Array.from({length: position+1}, () => 0);
  let queue=[];

  visited[s] = 1;
  queue.push([s, 0]);

  while(queue.length){
    let [v, p] = queue.shift();
    console.log(`v=${v}, p=${p}`)

    if (v === position) return p;

    for(let x of [v-1, v+1, v+5]){
      if (!visited[x] && x >= 1 && x <= 10000){
        visited[x]=1;
        queue.push([x, p+1]);
      }
    }
  }
}

πŸ‘‰πŸ½
v=5, p=0
v=4, p=1
v=6, p=1
v=10, p=1
v=3, p=2
v=9, p=2
v=7, p=2
v=11, p=2
v=15, p=2
v=2, p=3
v=8, p=3
v=14, p=3
3
λ°˜μ‘ν˜•

λŒ“κΈ€