반응형
https://leetcode.com/problems/time-based-key-value-store
class TimeMap {
private Map<String, List<Pair<String, Integer>>> map;
public TimeMap() {
map = new HashMap<>();
}
public void set(String key, String value, int timestamp) {
if(!map.containsKey(key)) map.put(key, new ArrayList<>());
map.get(key).add(new Pair(value, timestamp));
}
public String get(String key, int timestamp) {
if(!map.containsKey(key)) return "";
List<Pair<String, Integer>> list = map.get(key);
int left = 0;
int right = list.size() - 1;
String res = "";
while(left < right) {
// right 을 mid - 1 로 해주기 위해서는 mid 를 반올림 한 인덱스로 만들어줘야 루프를 탈출할 수 있다.
int mid = left + (right - left + 1) / 2;
if(list.get(mid).getValue() <= timestamp) {
left = mid; // 이 if 조건을 만족하는 가장 큰 left 가 계속해서 갱신된다.
// 왜? if 조건을 만족할 때 마다 left 가 점점 mid 쪽으로 이동해서 커지기 떄문임
}
else {
right = mid - 1;
}
}
return list.get(left).getValue() <= timestamp ? list.get(left).getKey() : "";
}
}
left = mid + 1; right = mid; 패턴으로도 풀 수 있다. 단, res 를 계속 업데이트 해줘야 한다.
class TimeMap {
private Map<String, List<Pair<String, Integer>>> map;
public TimeMap() {
map = new HashMap<>();
}
public void set(String key, String value, int timestamp) {
if(!map.containsKey(key)) map.put(key, new ArrayList<>());
map.get(key).add(new Pair(value, timestamp));
}
public String get(String key, int timestamp) {
if(!map.containsKey(key)) return "";
List<Pair<String, Integer>> list = map.get(key);
int left = 0;
int right = list.size() - 1;
String res = "";
while(left < right) {
int mid = left + (right - left) / 2;
if(list.get(mid).getValue() <= timestamp) {
res = list.get(mid).getKey();
// 우선 mid 가 조건을 만족하는 가장 큰 timestamp 를 가진 값이 된다.
// 왜 res 를 계속 업데이트 해주는가 ? -> 마지막에 left = mid + 1 에 의해 while 루프를 탈출한 left가 timestamp 보다 클 수 도 있기 때문임
left = mid + 1;
}
else {
right = mid;
}
}
// 마지막으로 나온 left 가 mid + 1 인데, 이것역시 timestamp 보다 작다면 left 가 가장 큰 값이 될 것이고,
// 아니면 그대로 res 를 리턴해주자.
return list.get(left).getValue() <= timestamp ? list.get(left).getKey() : res;
}
}
반응형
'알고리즘_개념 및 문제풀이 ' 카테고리의 다른 글
BinarySearch 의 패턴화 (1) | 2022.09.10 |
---|---|
Trie Class 구현 시 주의해야 할 부분 (0) | 2022.09.09 |
leetcode 887 superEggDrop (0) | 2022.07.19 |
206. Reverse Linked List (Leetcode) (0) | 2022.05.12 |
297. Serialize and Deserialize Binary Tree (0) | 2022.05.08 |