알고리즘

[프그래머스 2단계] 미로 탈출

고래강이 2024. 3. 18. 14:15

❓문제 설명

  • 특정 의미를 가진 문자 구성된 문자열로 이루어진 배열을 하나 줌
  • 미로탈출하는 것임 레버 당기고 S에서 E로 가는 최단시간을 구해야 함
  • 탈출 못하는 경우에는 -1을 반환해야 함

✅ 문제 해결

  • 탈출 못하는 경우를 먼저 생각해서 예외처리로 처리한 다음에 나머지를 처리해보자
  • 탈출 못하는 경우: 레버 상하좌우로 X가 있을 경우랑 S지점 상하좌우로 X가 있는 경우
  • 최단거리를 찾는 것은 어떻게 해야할까??? - 검색해보자 최소시간을 구하는 문제는 BFS로 풀라고 한다.
function solution(maps) {
    let cMaps = maps.map((e)=>[...e].map(a=>a))
    const bfs = (start, init = 0) => {
        cMaps[start[0]][start[1]] = init
        const [w, h] = [maps.length, maps[0].length],
              queue = [start]
        const [dirX, dirY] = [[0, 0, -1, 1], [-1, 1, 0, 0]]
        while (queue.length) {
            const [x, y] = queue.shift()
            for (let i =0; i < 4; i++) {
                const [dx, dy] = [x + dirX[i], y + dirY[i]]
                if (dx < 0 || dy < 0 || dx >= w || dy >= h) continue
                if (cMaps[dx][dy] === 'X' || cMaps[dx][dy] < 10000) continue
                else {
                    cMaps[dx][dy] = cMaps[x][y] + 1
                    queue.push([dx, dy])
                }
            }
        }
        return cMaps
    }
    
    
    const info = maps.reduce((acc, e, i)=> {
        for (let j= 0; j < e.length; j++) {
            if (e[j] === 'S' || e[j] === 'E' ||  e[j] === 'L') {
                acc[e[j]] = [i, j]
            }
        }
        return acc // 누적 객체를 반환하는 것이 중요한 것이구나
    }, {})
    let t = bfs(info.S)[info.L[0]][info.L[1]]
    if (t !== "L") {
        cMaps = maps.map((e)=>[...e].map(a=>a))
        t = bfs(info.L, t)[info.E[0]][info.E[1]]
    } else return -1
    return t !== 'E' ? t : -1
}
  • BFS의 개념에 대해서 부족한 부분도 많아서 다른 코드를 참고하면서 만들어 봄

🔥 인상 깊은 남의 풀이

https://song-ift.tistory.com/342

https://yjg-lab.tistory.com/399    

 

  • 코드에 대해서 참고를 하면서 각각 어떤 것을 의미하는지 이해하는데 초점을 많이 맞추게 되었다.

❕느낀점

  • BFS와 DFS가 그래프 탐색 방법이고 이러한 방법을 통해서 최소횟수를 구할 때 어떤 알고리즘을 먼저 떠올려야하는 지 알 수 있었다.
  • let, const를 통해서 재할당이 안되는 경우에 발생하는 에러에 대해서 이해도가 조금 더 좋아진 것 같다.
  • 메서드를 다양하게 사용한 것은 아니지만 알고리즘 방식에 대해서 queue의 형식에 대해서 조금 더 이해할 수 있었다.