Jieunny의 λΈ”λ‘œκ·Έ

[JS] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - κ²Œμž„ 맡 μ΅œλ‹¨κ±°λ¦¬ λ³Έλ¬Έ

Study/Coding Test

[JS] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - κ²Œμž„ 맡 μ΅œλ‹¨κ±°λ¦¬

Jieunny 2023. 7. 25. 16:13

πŸ“Œ  문제

ROR κ²Œμž„μ€ 두 νŒ€μœΌλ‘œ λ‚˜λˆ„μ–΄μ„œ μ§„ν–‰ν•˜λ©°, μƒλŒ€ νŒ€ μ§„μ˜μ„ λ¨Όμ € νŒŒκ΄΄ν•˜λ©΄ μ΄κΈ°λŠ” κ²Œμž„μž…λ‹ˆλ‹€. λ”°λΌμ„œ, 각 νŒ€μ€ μƒλŒ€ νŒ€ μ§„μ˜μ— μ΅œλŒ€ν•œ 빨리 λ„μ°©ν•˜λŠ” 것이 μœ λ¦¬ν•©λ‹ˆλ‹€.
μ§€κΈˆλΆ€ν„° 당신은 ν•œ νŒ€μ˜ νŒ€μ›μ΄ λ˜μ–΄ κ²Œμž„μ„ μ§„ν–‰ν•˜λ €κ³  ν•©λ‹ˆλ‹€. λ‹€μŒμ€ 5 x 5 크기의 맡에, λ‹Ήμ‹ μ˜ 캐릭터가 (ν–‰: 1, μ—΄: 1) μœ„μΉ˜μ— 있고, μƒλŒ€ νŒ€ μ§„μ˜μ€ (ν–‰: 5, μ—΄: 5) μœ„μΉ˜μ— μžˆλŠ” 경우의 μ˜ˆμ‹œμž…λ‹ˆλ‹€.
μœ„ κ·Έλ¦Όμ—μ„œ 검은색 뢀뢄은 벽으둜 λ§‰ν˜€μžˆμ–΄ 갈 수 μ—†λŠ” 길이며, 흰색 뢀뢄은 갈 수 μžˆλŠ” κΈΈμž…λ‹ˆλ‹€. 캐릭터가 움직일 λ•ŒλŠ” 동, μ„œ, 남, 뢁 λ°©ν–₯으둜 ν•œ μΉΈμ”© μ΄λ™ν•˜λ©°, κ²Œμž„ 맡을 λ²—μ–΄λ‚œ 길은 갈 수 μ—†μŠ΅λ‹ˆλ‹€.

λ§Œμ•½, μƒλŒ€ νŒ€μ΄ μžμ‹ μ˜ νŒ€ μ§„μ˜ μ£Όμœ„μ— 벽을 μ„Έμ›Œλ‘μ—ˆλ‹€λ©΄ μƒλŒ€ νŒ€ μ§„μ˜μ— λ„μ°©ν•˜μ§€ λͺ»ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό 같은 κ²½μš°μ— λ‹Ήμ‹ μ˜ μΊλ¦­ν„°λŠ” μƒλŒ€ νŒ€ μ§„μ˜μ— 도착할 수 μ—†μŠ΅λ‹ˆλ‹€.

κ²Œμž„ 맡의 μƒνƒœ mapsκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, 캐릭터가 μƒλŒ€ νŒ€ μ§„μ˜μ— λ„μ°©ν•˜κΈ° μœ„ν•΄μ„œ μ§€λ‚˜κ°€μ•Ό ν•˜λŠ” 칸의 개수의 μ΅œμ†Ÿκ°’을 return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”. 단, μƒλŒ€ νŒ€ μ§„μ˜μ— 도착할 수 없을 λ•ŒλŠ” -1을 return ν•΄μ£Όμ„Έμš”.
 

πŸ’‘  아이디어

μ΅œλ‹¨κ±°λ¦¬ -> BFS 
μ²˜μŒμ— visited 배열을 λ§Œλ“€μ–΄μ„œ λ°©λ¬Έ μ—¬λΆ€λ₯Ό ν‘œμ‹œν•΄μ€¬λŠ”λ° 계속 톡과λ₯Ό λͺ»ν–ˆλ‹€..
μ΄μœ λŠ” 이차원 λ°°μ—΄ 선언을 잘λͺ» ν–ˆκΈ° λ•Œλ¬Έ..

const visited = new Array(n).fill(new Array(m).fill(false));
// 이런 μ‹μœΌλ‘œ ν•˜λ©΄ map이 μ•ˆλŒμ•„μ„œ λ‹Ήμ—°νžˆ 이차원 배열이 잘λͺ» μ„ μ–Έλ˜λŠ”λ° μ™œ μ΄λ ‡κ²Œ ν–ˆμ§€

이차원 배열도 고치고 λ‹€μ‹œ μ‹œλ„ν–ˆμ§€λ§Œ μ‹œκ°„μ΄ˆκ³Ό -> visited 배열을 λ§Œλ“œλŠ” 게 νš¨μœ¨μ μ΄μ§€ X
visited 배열을 λ§Œλ“€μ§€ μ•Šκ³  κ·Έλƒ₯ maps 자체λ₯Ό 0으둜 λ°”κΏ”μ£Όλ©΄ μ–΄μ°¨ν”Ό λͺ»κ°€κΈ° λ•Œλ¬Έμ— visited 배열을 true둜 λ°”κΏ”μ£ΌλŠ” 것과 같은 μ—­ν• 
 

✏️  풀이

// μ‹œκ°„μ΄ˆκ³Ό μ½”λ“œ

function solution(maps) {
  var answer = 0;
  const n = maps.length;
  const m = maps[0].length;
  const queue = [[0, 0, 1]];
  const visited = Array.from(Array(n),() => Array(m).fill(0));
  visited[0][0] = true;
  const dx = [0, 0, -1, 1];
  const dy = [1, -1, 0, 0];

  while(queue.length) {
    let [x, y, count] = queue.shift();
    if(x === n-1 && y === m-1) return count;
    
    for(let i=0; i<4; i++){
      const moveX = x + dx[i];
      const moveY = y + dy[i];

      if(moveX >= 0 && moveX < n && moveY >= 0 && moveY < m) {
        if(!visited[moveX][moveY] && maps[moveX][moveY] === 1) {
          visited[moveX][moveY] = false;
          queue.push([moveX, moveY, count + 1]);
        }
      }
    }
  }
  return -1;
}
// μ •λ‹΅ μ½”λ“œ
function solution(maps) {
  var answer = 0;
  const n = maps.length;
  const m = maps[0].length;
  const queue = [[0, 0, 1]];
  const dx = [0, 0, -1, 1];
  const dy = [1, -1, 0, 0];
  if(maps[n-1][m-2] === 0 && maps[n-2][m-1] === 0) return -1;

  while(queue.length) {
    let [x, y, count] = queue.shift();
    if(x === n-1 && y === m-1) return count;
    
    for(let i=0; i<4; i++){
      const moveX = x + dx[i];
      const moveY = y + dy[i];

      if(moveX >= 0 && moveX < n && moveY >= 0 && moveY < m) {
        if(maps[moveX][moveY] === 1) {
          maps[moveX][moveY] = 0;
          queue.push([moveX, moveY, count + 1]);
        }
      }
    }
  }
  return -1;
}