[프로그래머스] 코딩테스트 연습 - 41

krkorklo·2022년 2월 8일
0

프로그래머스

목록 보기
41/78

level 2 - 게임 맵 최단거리

게임 맵의 상태 maps가 매개변수로 주어질 때, 캐릭터가 상대 팀 진영에 도착하기 위해서 지나가야 하는 칸의 개수의 최솟값을 return 하도록 solution 함수를 완성해주세요. 단, 상대 팀 진영에 도착할 수 없을 때는 -1을 return 해주세요.

입출력 예시
maps : [[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,1],[0,0,0,0,1]]
-> 11

function solution(maps) {
    var answer = 0;
    var n = maps.length - 1;
    var m = maps[0].length - 1;
    var visited = maps.map((map) => map.map((m) => m == 0 ? true : false));
    var queue = [[0, 0]];
    
    if (maps[n][m - 1] == 0 && maps[n - 1][m] == 0) return -1;
    
    while(queue.length != 0) {
        var [x, y] = queue.shift();
        bfs(x, y);
    }
    function bfs(i, j) {
        if (visited[i][j]) return;
        if (i == n && j == m) return;
        visited[i][j] = true;
        if (i > 0 && !visited[i - 1][j]) {
            if (maps[i - 1][j] == 1) maps[i - 1][j] += maps[i][j];
            else if (maps[i - 1][j] > maps[i][j] + 1) maps[i - 1][j] = maps[i][j] + 1;
            queue.push([i - 1, j]);
        }
        if (j > 0 && !visited[i][j - 1]) {
            if (maps[i][j - 1] == 1) maps[i][j - 1] += maps[i][j];
            else if (maps[i][j - 1] > maps[i][j] + 1) maps[i][j - 1] = maps[i][j] + 1;
            queue.push([i, j - 1]);
        }
        if (i < n && !visited[i + 1][j]) {
            if (maps[i + 1][j] == 1) maps[i + 1][j] += maps[i][j];
            else if (maps[i + 1][j] > maps[i][j] + 1) maps[i + 1][j] = maps[i][j] + 1;
            queue.push([i + 1, j]);
        }
        if (j < m && !visited[i][j + 1]) {
            if (maps[i][j + 1] == 1) maps[i][j + 1] += maps[i][j];
            else if (maps[i][j + 1] > maps[i][j] + 1) maps[i][j + 1] = maps[i][j] + 1;
            queue.push([i, j + 1]);
        }
    }
    return answer = maps[n][m];
}

또오 문제 제대로 안 읽고 가로세로 길이가 같다고 생각했다가 시간 좀 날렸다.
그리고 이렇게 풀었는데 (이것도 어어어어ㅓㅁ어ㅓ엄청 오래 걸렸는데) 자꾸 틀리다고 나옴...
눈 빠질 것 같아서 쉬다가 다시 생각해보니깐

ㅎㅎ
중간에 막히는 부분을 생각 못햤다.
ㅎㅎㅎㅎ

function solution(maps) {
    var answer = 0;
    var n = maps.length - 1;
    var m = maps[0].length - 1;
    var visited = maps.map((map) => map.map((m) => m == 0 ? true : false));
    var queue = [[0, 0]];
    
    while(queue.length != 0) {
        var [x, y] = queue.shift();
        bfs(x, y);
    }
    function bfs(i, j) {
        if (visited[i][j]) return;
        if (i == n && j == m) {
            visited[n][m] = true;
            return;
        }
        visited[i][j] = true;
        if (i > 0 && !visited[i - 1][j]) {
            if (maps[i - 1][j] == 1) maps[i - 1][j] += maps[i][j];
            else if (maps[i - 1][j] > maps[i][j] + 1) maps[i - 1][j] = maps[i][j] + 1;
            queue.push([i - 1, j]);
        }
        if (j > 0 && !visited[i][j - 1]) {
            if (maps[i][j - 1] == 1) maps[i][j - 1] += maps[i][j];
            else if (maps[i][j - 1] > maps[i][j] + 1) maps[i][j - 1] = maps[i][j] + 1;
            queue.push([i, j - 1]);
        }
        if (i < n && !visited[i + 1][j]) {
            if (maps[i + 1][j] == 1) maps[i + 1][j] += maps[i][j];
            else if (maps[i + 1][j] > maps[i][j] + 1) maps[i + 1][j] = maps[i][j] + 1;
            queue.push([i + 1, j]);
        }
        if (j < m && !visited[i][j + 1]) {
            if (maps[i][j + 1] == 1) maps[i][j + 1] += maps[i][j];
            else if (maps[i][j + 1] > maps[i][j] + 1) maps[i][j + 1] = maps[i][j] + 1;
            queue.push([i, j + 1]);
        }
    }
    return answer = (visited[n][m] ? maps[n][m] : -1);
}

해결쓰

0개의 댓글