🖥️ CS/SW Expert 외의 Algorithms
LeetCode 841. Keys and Rooms (Java)
한국의 메타몽
2023. 2. 26. 01:44
문제 링크
The problem link : LeetCode 841. Keys and Rooms
문제 요약
- 0번째부터 n-1까지 라벨이 붙여진 방이 있습니다.
- 0번째 문을 제외한 나머지 문은 잠겨있습니다.
- 방에 들어갔을때, 해당 방에 존재하는 key를 사용할 수 있게됩니다. 이렇게되면 key를 사용해 해당 방에 들어갈 수 있습니다.
- 당신의 목적은 0번째부터 n-1까지의 모든 방을 들어가는 겁니다. 가능할 경우
true
를, 그렇지 않을 경우false
를 출력하세요.
예시
입력값 : rooms = [[1,3],[3,0,1],[2],[0]]
출력값 : false
해설 : 2번째 방(=[2])에 들어갈 수 없기 때문에 false입니다.
조건
- n == rooms.length - 2 <= n <= 1,000
- 0 <= rooms[i].length <= 1,000
- 1 <= sum(rooms[i].length) <= 3,000
- 0 <= rooms[i][j] < n - rooms[i]에 있는 값들은 동일하지 않고 모두 고유합니다.
문제 풀이
class Solution {
public boolean canVisitAllRooms(List<List> rooms) {
if(rooms.size() == 0) return true;
boolean[] visited = new boolean[rooms.size()];
Queue<Integer> q = new LinkedList<>();
for(Integer room : rooms.get(0)){ // 0
q.offer(room);
}
visited[0] = true;
while(!q.isEmpty()) { // 1
Integer pos = q.peek();
if(!visited[pos]) {
for(Integer temp : rooms.get(pos)) {
q.offer(temp);
}
visited[pos] = true;
}
q.remove();
}
for(boolean temp : visited){ // 2
if(!temp) return false;
}
return true;
}
}
BFS
를 활용한 Graph 문제 입니다.
- rooms[0]에 있는 key를 모두 큐에 저장한 뒤, 0번째 방은 방문했다는 표시를 해줍니다.
- 큐에 저장된 첫 번째 값(이하 '키')부터 탐색을 시작합니다. 만약 큐에 저장된 첫번째 키에 해당되는 방을 방문한 적이 없다면, 해당 방에 저장된 모든 키를 큐에 저장합니다. 그런 다음, 해당 방을 방문처리 해주고 큐에서 제거합니다.
- 모든 방에서 한 곳이라도 방문한 적이 없다면 false를, 그렇지 않고 for문을 통과한다면 true를 반환해줍니다.
시간 복잡도
O(N+E)입니다.
(N=room의 개수, E=key(각 room이 가지고있는 key)의 개수)
공간복잡도는 O(N) 입니다.