There are n rooms labeled from 0 to n - 1 and you start in the room 0.
All the rooms labeled from 1 to n are initially locked and you cannot enter a locked room without having its key.
When you visit a room, you may find a set of distinct keys in it
and you can use them to open locked rooms and enter them.
You can visit the same room any number of times and the goal is to visit all the nrooms.
Given an array rooms where rooms [i] is the set of keys that you can obtain if you visited room i,
return true if you can visit all the rooms, or falseotherwise.
0부터 n-1까지의 이름 지어진 방이 있고, 0번째 방부터 시작된다.
1부터 n까지의 모든 방은 초반에 잠겨 있고, 열쇠가 없이는 들어갈 수 없다.
특정 방에 방문했을 때, 열쇠 꾸러미를 발견할 수 있고 그 열쇠 꾸러미를 이용해 잠긴 방을 방문할 수 있다.
방문했던 방에는 몇 번이고 중복해서 방문할 수 있고, 최종 목표는 모든 방에 방문하는 것이다.
방들의 배열이 주어지고, 해당 방에는 열쇠 꾸러미 정보를 가지고 있다.
만약 주어진 정보로 모든 방들을 방문할 수 있으면 true를 반환하고 그렇지 않으면 false를 반환하라.
주어진 방들과 열쇠들의 정보는 tree 형태로 형상화할 수 있다.
주어진 트리를 방문하며, 방문한 방들의 정보를 저장하고 모든 트리의 노드를 순회했을 때 저장한 방문한 방들의 모든 정보가 주어진 방들의 길이와 같으면 모든 방을 방문한 것이다.
recursive 한 형태로 순환을 하고, Depth First Search를 이용하여 tree를 방문하여 보자.
public boolean canVisitAllRooms(List<List<Integer>> rooms) {
List<Integer> visited = new ArrayList<>(); // 방문한 방들의 정보를 저장
recursiveVisit(visited, rooms, 0); // 0번 방부터 시작
if (visited.size() == rooms.size()) { // 주어진 방의 갯수와 방문한 방의 갯수 비교
return true;
}
return false;
}
private void recursiveVisit(List<Integer> visited, List<List<Integer>> rooms, int i) {
visited.add(i);
List<Integer> list = rooms.get(i);
for (int idx : list) {
if (!visited.contains(idx)) { // 이미 방문한 방은 다시 방문할 필요가 없다
recursiveVisit(visited, rooms, idx);
}
}
}
'LeetCode' 카테고리의 다른 글
[Leetcode][Java] 704 Binary Search (0) | 2021.12.08 |
---|---|
[Leetcode][Java] 347 Top K Frequent Elements (0) | 2021.08.08 |
[Leetcode][Java] 101 Symmetric Tree (0) | 2021.07.07 |
[Leetcode][Java] 79 Word Search (단어 찾기) (0) | 2021.06.18 |
[Leetcode][Java] 46 Permutations (순열) (0) | 2021.06.09 |