Skip to main content

미로 탈출

작성일 : 2024.11.09

1. 문제 파악​

  • 문제의 요점 : 너비우선탐색 BFS방식을 통해 최단거리를 구하는 방식

2. 내 풀이​

function findDistance(maps, start, target) {
  var moveCount = 0;
  let moveX = [1, -1, 0, 0];
  let moveY = [0, 0, 1, -1];

  var goX = 0;
  var goY = 0;

  maps[start[0]][start[1]] = "X";

  var queue = [start];

  while (queue.length > 0) {
    var size = queue.length;
    for (var i = 0; i < size; i++) {
      let [x, y] = queue.shift();
      for (var k = 0; k < 4; k++) {
        goX = x + moveX[k];
        goY = y + moveY[k];
        if (
          goX >= 0 &&
          goX < maps.length &&
          goY >= 0 &&
          goY < maps[0].length &&
          maps[goX][goY] !== "X"
        ) {
          if (maps[goX][goY] === target) {
            return moveCount + 1;
          } else {
            queue.push([goX, goY]);
            maps[goX][goY] = "X";
          }
        } else {
          continue;
        }
      }
    }
    moveCount++;
  }

  return -1;
}

function solution(maps) {
  var answer = 0;
  var findLever = -1;
  var findExit = -1;

  var start = [];
  var lever = [];

  // Find Start Point, Lever Point (Starting Point)
  for (let i = 0; i < maps.length; i++) {
    for (let k = 0; k < maps[i].length; k++) {
      if (maps[i][k] === "S") {
        start = [i, k];
      } else if (maps[i][k] === "L") {
        lever = [i, k];
      }
    }
  }

  let mapsLever = maps.map((item) => item.split(""));
  let mapsExit = maps.map((item) => item.split(""));
  findLever = findDistance(mapsLever, start, "L");
  findExit = findDistance(mapsExit, lever, "E");

  if (findLever !== -1 && findExit !== -1) {
    answer = findLever + findExit;
  } else {
    answer = -1;
  }

  return answer;
}
풀이 방식​
  • 우선적으로 start포인트, lever포인트를 찾아야 한다고 생각했다.
  • 그렇게 잡은 start포인트와 lever포인트를 사용하여, start -> lever , lever -> end까지의 두번의 최단거리를 찾아, 찾은 두개의 최단거리를 더해 최종값을 반환하는 구조로 설계했다.
  • javascript에서 함수로 인자값을 보낼 경우, 파라미터의 값이 변경되는 문제가 발견해, mapsLever, mapsExit 두개의 map을 구성하여 진행하였다.
  • 최단거리를 구하는 알고리즘으로 BFS를 사용하였으며, queue의 값이 모두 없어질 때까지 무한루프를 돌면서, 만약 target이 발견되어 횟수를 return 하여 탈출하거나 모두 없어졌음에도 target을 발견하지 못한 경우에는 탈출 불가능으로 간주하여 -1을 반환하는 로직으로 설계했다.
느낀 점​

코딩테스트 lv2를 이번에 본격적으로 처음 접해봤는데, 확실히 자료구조의 구현 방법에 대해 공부 및 연구할 필요성을 느꼈다. 특히 이번 문제는 BFS를 사용하지 않으면 타임아웃으로 실패를 뜬 것을 확인하여, 이를 해결하고자 javascript로 BFS를 공부 및 구현하는 데에 집중을 하여 해결하였다. 이를 통해 자료구조 공부의 필요성을 느꼈고, 이를 활용하면 협업에서 성능 개선에 큰 도움을 줄 것으로 생각이 되었다.