반응형
https://leetcode.com/problems/keys-and-rooms/
1. 2022.01.30 시도
소요시간: 11분(3분 구상, 8분 코딩, recursive), 4분(앞서 구상, 4분 코딩, iterative)
// recursive
class Solution {
public boolean canVisitAllRooms(List<List<Integer>> rooms) {
if (rooms == null || rooms.size() == 0) {
return true;
}
int roomSize = rooms.size();
boolean[] visited = new boolean[roomSize];
openDoor(0, rooms, visited);
int counter =0;
for (int i=0; i<visited.length; i++) {
if (visited[i] == true) counter++;
}
return counter == roomSize;
}
public void openDoor(int index, List<List<Integer>> rooms, boolean[] visited) {
if (visited[index]) {
return;
}
visited[index] = true;
List<Integer> keys = rooms.get(index);
for (int key: keys) {
openDoor(key, rooms, visited);
}
}
}
// iterative
class Solution {
public boolean canVisitAllRooms(List<List<Integer>> rooms) {
if (rooms == null || rooms.size() == 0) {
return true;
}
int roomSize = rooms.size();
boolean[] visited = new boolean[roomSize];
LinkedList<List<Integer>> stack = new LinkedList<>();
stack.push(rooms.get(0));
visited[0] = true;
while (!stack.isEmpty()) {
List<Integer> keys = stack.pop();
for (int key: keys) {
if (visited[key] == true) {
continue;
}
visited[key] = true;
stack.push(rooms.get(key));
}
}
int counter =0;
for (int i=0; i<visited.length; i++) {
if (visited[i] == true) counter++;
}
return counter == roomSize;
}
}
풀이 접근 과정
조건을 보니 범위가 제한적이다. 이건 array를 룸 갯수만큼 생성해서 사용하면 편하겠구나 생각했다. 이때 만들 array는 방문여부다. 방문여부를 boolean[]로 생성하되 최대 1000개이니 그것에 맞춰 만들어야겠다.
boolean[] visited으로 체크하면 O(n)으로 찾아낼 수 있겠다. 싶었다.
느낀점
- 문제 유형을 뭐라할지 모르겠으나 방문여부만 체크하면 사실 기존의 문제유형들과 다르지 않았다.
- 실제로 TimeComplexity는 O(N+E)이다. N은 룸의 갯수이고 E는 키의 갯수다.
알고리즘 정리노트: .leetcode(알고리즘 문제풀이 접근)
반응형
'알고리즘 풀이' 카테고리의 다른 글
.leetcode(515. Find Largest Value in Each Tree Row) (0) | 2022.01.30 |
---|---|
.leetcode(11. Container With Most Water) (0) | 2022.01.30 |
.leetcode(657. Robot Return to Origin) (0) | 2022.01.27 |
.leetcode(876. Middle of the Linked List) (0) | 2022.01.24 |
.leetcode(125. Valid Palindrome) (0) | 2022.01.24 |