BFS | LeetCode - 841. Keys and Rooms java

728x90

https://leetcode.com/problems/keys-and-rooms/description/

 

 

0부터 n-1까지의 번호가 붙은 방들이 있고, 잠겨있는 방 문을 열기 위해서는 각 방에 놓여있는 방 번호와 일치하는 열쇠로 문을 열 수 있다.

모든 방은 잠겨있으므로 열쇠가 필요하다.

 

2차원 배열이 주어지고, 배열의 1차원 인덱스는 각 방의 번호를, 2차원 인덱스의 요소들은 열쇠를 뜻한다.

예를 들어 다음과 같은 배열이 주어진다면,

Input: rooms = [[1],[2],[3],[]]

 

rooms[0] = {1,2} 이므로, 0번째 방에서는 1번 방과 2번 방을 갈 수 있는 열쇠를 얻을 수 있음을 뜻한다.

 

이러한 상황에서 가장 많은 방을 탐색할 수 있는 경우의 방 개수를 구하는 문제이다.

 

이 문제는 인접 리스트로 구현된 그래프 탐색 문제를 푸는 방식으로 문제를 해결할 수 있으므로 bfs로 해결할 수 있었다.

 

class Solution {
public boolean canVisitAllRooms(List<List<Integer>> rooms) {
        //bfs
        Map<Integer, Boolean> chk = new HashMap<>();
        Queue<Integer> q = new LinkedList<>();

        for (int i = 0; i < rooms.get(0).size(); i++) {
            q.offer(rooms.get(0).get(i));
            chk.put(0, true);
        }

        while (!q.isEmpty()) {
            int curr = q.poll();
            chk.put(curr, true);
            for (int next : rooms.get(curr)) {
                if (!chk.containsKey(next)) {
                    q.offer(next);

                }
            }
        }

        if (chk.size() != rooms.size()) {
            for(int i = 0; i<rooms.size(); i++) {
                if(!chk.containsKey(i)) {
                    return false;
                }
            }
        }
        return true;
    }
}

 

 

동일한 방을 중복 탐색할 필요가 없으므로 무한 루프를 방지하기 위해 방문을 체크하는 map을 선언하고, 열쇠를 받아 탐색할 수 있도록 queue를 선언하였다.

Map<Integer, Boolean> chk = new HashMap<>();
Queue<Integer> q = new LinkedList<>();

 

방 탐색은 0번 방부터 시작하므로 0번 방에서 얻을 수 있는 열쇠를 queue에 담고 탐색을 시작하였다.

for (int i = 0; i < rooms.get(0).size(); i++) {
    q.offer(rooms.get(0).get(i));
    chk.put(0, true);
}

 

다음 방으로 갈 수 있는 여부는 다음과 같은 요소에 의해 결정된다.

1. 열쇠가 있는지

2. 모든 방을 탐색하진 않았는지

 

1번의 경우는 얻은 열쇠를 모두 queue에 넣어(인벤토리라고 생각해도 될 것 같다.) 다음으로 갈 수 있는 방을 체크하면 되고, 2번의 경우에는 방문한 방을 기록하여 이전에 방문한 방이 주어진 방 개수(rooms.size()) 와 같아지는지 체크하면 된다.

 

 while (!q.isEmpty()) {
    int curr = q.poll();
    chk.put(curr, true);
    for (int next : rooms.get(curr)) {
        if (!chk.containsKey(next)) {
            q.offer(next);

        }
    }
}

if (chk.size() != rooms.size()) {
    for(int i = 0; i<rooms.size(); i++) {
        if(!chk.containsKey(i)) {
            return false;
        }
    }
}

 

728x90

'Algorithm > LeetCode' 카테고리의 다른 글

DP | 70. Climbing Stairs Java  (2) 2024.08.24
DFS | LeetCode - 200. Number of Islands Java  (0) 2024.07.30
DFS | N-Queens Java  (0) 2024.07.20
Stack | 739. Daily Tempuratures  (0) 2024.07.05
Stack | 20. Valid Patentheses  (0) 2024.07.05