하루에 1문제씩 풀기.
한 문제당 30분씩은 고민하기.
왜 그렇게 풀었는지 공유하기.
하루라도 놓친다면 벌금은 1,000원
백준 플래티넘, 프로그래머스 4단계, 개발자 탈퇴 시 모임 탈퇴 가능
[3코1파] 2023.01.04~ (199차)
[4코1파] 2023.01.13~ (191일차)
[1스4코1파] 2023.04.12~ (102일차)
[1스4코2파] 2023.05.03 ~ (80일차)
2023.07.21 [199일차]
linked list
https://leetcode.com/problems/lru-cache/
문제 설명
LRU 캐시의 제약 조건을 따르는 데이터 구조를 설계하는 LRUCache 클래스를 구현함
LRUCache(int 용량) 양수 크기 용량으로 LRU 캐시를 초기화하고, get 메서드에서 key가 존재하면 키 값을 반환 아니면 -1을 반환하고, put의 경우에는 key 가 존재하면 key에 해당하는 value값을 업데이트하고, 없다면 key-value 쌍을 추가한다. key 수가 용량ㅇ르 초과하면 가장 최근에 사용한 키를 제거한다.
각 get, put 은 시간복잡도 O(1)로 이뤄져야함
문제 풀이 방법
linked list node 클래스랑 그에 대한 remove, insert 메소드를 추가해서 풀어줘야 하는 문제네... 에효효
내 코드
class Node:
def __init__(self, key, val):
self.key, self.val = key, val
self.prev = self.next = None
class LRUCache:
def __init__(self, capacity: int):
self.cap = capacity
self.cache = {}
self.left, self.right = Node(0,0), Node(0,0)
self.left.next, self.right.prev = self.right, self.left
def remove(self, node):
prev, nxt = node.prev, node.next
prev.next, nxt.prev = nxt, prev
def insert(self, node):
prev, nxt = self.right.prev, self.right
prev.next = nxt.prev = node
node.next, node.prev = nxt, prev
def get(self, key: int) -> int:
if key in self.cache:
self.remove(self.cache[key])
self.insert(self.cache[key])
return self.cache[key].val
return -1
def put(self, key: int, value: int) -> None:
if key in self.cache:
self.remove(self.cache[key])
self.cache[key] = Node(key, value)
self.insert(self.cache[key])
if len(self.cache) > self.cap:
lru = self.left.next
self.remove(lru)
del self.cache[lru.key]
증빙
여담
지금으로부터 3시간 뒤 나는 서울 신궁동감자탕에서 뼈구이를 먹을 것이다.