강의로 돌아가기
Horyong Jung

BFS 로 해도 효율성 통과못하는 분들 참고하세요

혹시 본인의 코드가 방문체크를 큐에서 꺼낼 때 하고있는건 아닌지 확인해보세요.
방문체크를 큐에 넣을 때 해야 효율성이 통과됩니다.
그 이유는 만약 꺼낼 때 방문체크를 하게되면, 하나의 블럭을 꺼내서 통로를 탐색할 때, 이미 큐에 들어있는 블럭을 또 큐에 넣을 수도 있기 때문입니다.

1 0 9 10(1) 11
2 0 8 0 10(2)
3 0 7 8 9
4 5 6 0 10(3)
0 0 0 0 11

이 문제의 예시를 예로 들면,
각 블럭의 숫자는 BFS로 탐색되는 차례입니다.
큐에서 10(1)을 먼저 꺼낸다고 하면, 10(1)은 11을 큐에 넣겠죠.
그럼 이제 큐에서 10(2) 가 꺼내집니다.
그런데 10(2)는 11을 아직 방문하지 않은 블럭이라고 판단하고 다시 큐에 넣게 됩니다.
이런 중복을 없애기 위해 큐에 넣을 때 방문했다고 체크해야 합니다.

저도 이거때문에 헤맸는데 혹시 저같은 어려움을 겪고 계신 분이 있다면 도움이 되었으면 좋겠습니다.

작성중인 코드―solution.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
function solution(maps) {
    var answer = -1;
    let row = maps.length, col = maps[0].length;
    let dy = [0, 1, 0, -1], dx = [-1, 0, 1, 0];
    let queue = [[0, 0, 1]];

    while (queue.length){
        var answer = -1;
        let [y,x,count] = queue.shift();
        if (y === row-1 && x === col-1) return count;
        //maps[y][x] = 0;

        for (let i = 0; i < 4; i++){
            let ny = y + dy[i];
            let nx = x + dx[i];

            if (ny < 0 || ny >= row || nx < 0 || nx >= col) continue;
            if (maps[ny][nx] === 0) continue;
            maps[ny][nx] = 0; // 큐에 넣을 때 방문표시를 해야한다.
            queue.push([ny, nx, count+1])
        }
    }
    return answer;
}

// function solution(maps) {

//     var yLen = maps.length - 1;
//     var xLen = maps[0].length - 1;

//     var queue = [[0, 0]];

//     var visited = Array.from(new Array(maps.length), () => new Array(maps[0].length).fill(false));

//     var result = 0;

//     while (queue.length) {
//         result++;
//         var size = queue.length;
//         for (var i = 0; i < size; i++) {
//             var point = queue.shift();
//             var curY = point[0];
//             var curX = point[1];

//             if (visited[curY][curX]) continue;

//             maps[curY][curX] = 0;

//             visited[curY][curX] = true;

//             if (curY === yLen && curX === xLen) return result;

//             if (curY < yLen && maps[curY + 1][curX] === 1) queue.push([curY + 1, curX])
//             if (curX < xLen && maps[curY][curX + 1] === 1) queue.push([curY, curX + 1])
//             if (curY > 0 && maps[curY - 1][curX] === 1) queue.push([curY - 1, curX])
//             if (curX > 0 && maps[curY][curX - 1] === 1) queue.push([curY, curX - 1])
//         }
//     }

//     return -1;
// }

// function solution(maps) {
//     let answer = -1;
//     let xpos = [0,0,1,-1];
//     let ypos = [1,-1,0,0];

//     const q = [[0,0,1]];
//     while(q.length != 0){
//         let val = q.shift()
//         let y=val[0];
//         let x=val[1];
//         let cnt=val[2];
//         if (y === maps.length-1 && x === maps[0].length-1){
//             answer = cnt
//             break;
//         }
//         for(let i = 0; i < 4;i++){
//             let yy = y + ypos[i];
//             let xx = x + xpos[i];

//             if (yy < 0 || xx < 0 || xx>=maps[0].length || yy>=maps.length){
//             continue
//             }
//             if(maps[yy][xx] ==0 ){
//                 continue
//             }
//             if(maps[yy][xx] ==2 ){
//                 continue
//             }
//             maps[yy][xx] =2
//             q.push([yy,xx,cnt+1])
//         }
//     }
//     return answer;
// }
  • DONGWON KIM

    좋은 내용 감사합니다, BFS문제풀때 주의해야겟네요

    DONGWON KIM―2021.12.26 22:37
  • Sung DaeKyoung

    저도 이거보고 수정해서 통과했네요. 말씀하신대로 queue에 특성상 먼저 앞에있는것부터 처리된 후에 방문처리를 늦게 해버리니 정작 같은곳을 여러번 방문 해버리는 경우가 생겼던거네요 ㅠㅠ

    Sung DaeKyoung―2022.02.05 19:04
  • 황동엽

    감사합니다

    황동엽―2022.03.09 11:02
  • yhkim-4504

    감사합니다

    yhkim-4504―2022.03.13 19:32
  • joongi

    BFS 구현해서 좋아하고있었는데 성능에서 자꾸 탈락이 나와서 이상한 실수를 하고있었네요 ㅠㅠ BFS구현때 참고하겠습니다. 감사합니다.

    joongi―2022.04.16 19:49
  • Jiwoo

    감사합니다! 덕분에 해결했습니다

    Jiwoo―2022.06.18 18:19
  • 나윤상

    wow 이거 꿀팁이네요 감사합니다

    나윤상―2022.07.04 22:17
  • taehyeong1998@gmail.com

    좋은 글 감사합니다.

    taehyeong1998@gmail.com―2022.09.08 17:27
  • MINNyoen

    진짜 감사합니다.. 덕분에 답답한게 풀렸습니다....

    MINNyoen―2022.09.16 04:55
  • 손원우

    아 이거였네요 감사합니다 복 받으세요 선생님

    손원우―2022.10.04 15:04
  • onegrace93

    사소한 부분인줄 알았는데 생각했던것보다 크게작용하네요 감사합니다

    onegrace93―2022.10.29 00:31
  • 이준성

    님은 갓입니다...

    이준성―2023.01.27 16:58
  • 유정민

    와... 진짜 감사합니다!!

    유정민―2023.06.22 23:24
  • 유대하

    깔끔하고 정성스런 설명 감사합니다!

    유대하―2024.04.08 22:56
1 개의 답변
박찬호

디테일을 놓치고 있었네요 감사합니다

답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.