이곳저곳 여행을 다니다보니 코딩에 소원해졌다. 다시 열심히 해보자.
https://leetcode.com/problems/lru-cache/description/?envType=study-plan-v2&envId=top-interview-150
class Node{
int key;
int val;
Node prev;
Node next;
public Node(int key, int val){
this.key = key;
this.val = val;
this.prev = null;
this.next = null;
}
}
class LRUCache {
private int cap;
private Map<Integer, Node> cache;
private Node oldest;
private Node latest;
public LRUCache(int capacity) {
this.cap = capacity;
this.cache = new HashMap<>();
this.oldest = new Node(0,0);
this.latest = new Node(0,0);
this.oldest.next = this.latest;
this.latest.prev = this.oldest;
}
public int get(int key) {
if (cache.containsKey(key)){
Node node = cache.get(key);
remove(node);
insert(node);
return node.val;
}
return -1;
}
public void remove(Node node){
Node prev = node.prev;
Node next = node.next;
prev.next = next;
next.prev = prev;
}
public void insert(Node node){
Node prev = latest.prev;
Node next = latest;
prev.next = next.prev = node;
node.next = next;
node.prev = prev;
}
public void put(int key, int value) {
if (cache.containsKey(key)){
remove(cache.get(key));
}
Node newNode = new Node(key, value);
cache.put(key, newNode);
insert(newNode);
if (cache.size() > cap){
Node lru = oldest.next;
remove(lru);
cache.remove(lru.key);
}
}
}
/**
* Your LRUCache object will be instantiated and called as such:
* LRUCache obj = new LRUCache(capacity);
* int param_1 = obj.get(key);
* obj.put(key,value);
*/
어렵다.... 결국 답안을 보고 말았다.
오랜만에 하니까 확실히 힘든 것 같다.