Skip to content

Commit 6509304

Browse files
leahincomtrekhleb
andauthoredJul 13, 2024
update LRU Cache translation for ko-KR (trekhleb#987)
* feat: LRU cache translation in ko-KR * chore: add readInAnotherLan for ko-KR --------- Co-authored-by: Oleksii Trekhleb <[email protected]>
1 parent 09afeb5 commit 6509304

File tree

2 files changed

+60
-6
lines changed

2 files changed

+60
-6
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# LRU 캐시 알고리즘
2+
3+
**LRU 캐시 알고리즘** 은 사용된 순서대로 아이템을 정리함으로써, 오랜 시간 동안 사용되지 않은 아이템을 빠르게 찾아낼 수 있도록 한다.
4+
5+
한방향으로만 옷을 걸 수 있는 옷걸이 행거를 생각해봅시다. 가장 오랫동안 입지 않은 옷을 찾기 위해서는, 행거의 반대쪽 끝을 보면 됩니다.
6+
7+
## 문제 정의
8+
9+
LRUCache 클래스를 구현해봅시다:
10+
11+
- `LRUCache(int capacity)` LRU 캐시를 **양수**`capacity` 로 초기화합니다.
12+
- `int get(int key)` `key` 가 존재할 경우 `key` 값을 반환하고, 그렇지 않으면 `undefined` 를 반환합니다.
13+
- `void set(int key, int value)` `key` 가 존재할 경우 `key` 값을 업데이트 하고, 그렇지 않으면 `key-value` 쌍을 캐시에 추가합니다. 만약 이 동작으로 인해 키 개수가 `capacity` 를 넘는 경우, 가장 오래된 키 값을 **제거** 합니다.
14+
15+
`get()``set()` 함수는 무조건 평균 `O(1)` 의 시간 복잡도 내에 실행되어야 합니다.
16+
17+
## 구현
18+
19+
### 버전 1: 더블 링크드 리스트 + 해시맵
20+
21+
[LRUCache.js](./LRUCache.js) 에서 `LRUCache` 구현체 예시를 확인할 수 있습니다. 예시에서는 (평균적으로) 빠른 `O(1)` 캐시 아이템 접근을 위해 `HashMap` 을 사용했고, (평균적으로) 빠른 `O(1)` 캐시 아이템 수정과 제거를 위해 `DoublyLinkedList` 를 사용했습니다. (허용된 최대의 캐시 용량을 유지하기 위해)
22+
23+
![Linked List](./images/lru-cache.jpg)
24+
25+
_[okso.app](https://okso.app) 으로 만듦_
26+
27+
LRU 캐시가 어떻게 작동하는지 더 많은 예시로 확인하고 싶다면 LRUCache.test.js](./**test**/LRUCache.test.js) 파일을 참고하세요.
28+
29+
### 버전 2: 정렬된 맵
30+
31+
더블 링크드 리스트로 구현한 첫번째 예시는 어떻게 평균 `O(1)` 시간 복잡도가 `set()``get()` 으로 나올 수 있는지 학습 목적과 이해를 돕기 위해 좋은 예시입니다.
32+
33+
그러나, 더 쉬운 방법은 자바스크립트의 [Map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) 객체를 사용하는 것입니다. 이 `Map` 객체는 키-값 쌍과 키를 **추가하는 순서 원본** 을 지닙니다. 우리는 이걸 아이템을 제거하거나 다시 추가하면서 맵의 "가장 마지막" 동작에서 최근에 사용된 아이템을 유지하기 위해 사용할 수 있습니다. `Map` 의 시작점에 있는 아이템은 캐시 용량이 넘칠 경우 가장 먼저 제거되는 대상입니다. 아이템의 순서는 `map.keys()` 와 같은 `IterableIterator` 을 사용해 확인할 수 있습니다.
34+
35+
해당 구현체는 [LRUCacheOnMap.js](./LRUCacheOnMap.js)`LRUCacheOnMap` 예시에서 확인할 수 있습니다.
36+
37+
이 LRU 캐시 방식이 어떻게 작동하는지 더 많은 테스트 케이스를 확인하고 싶다면 [LRUCacheOnMap.test.js](./__test__/LRUCacheOnMap.test.js) 파일을 참고하세요.
38+
39+
## 복잡도
40+
41+
| | 평균 |
42+
| --------------- | ------ |
43+
| 공간 | `O(n)` |
44+
| 아이템 찾기 | `O(1)` |
45+
| 아이템 설정하기 | `O(1)` |
46+
47+
## 참조
48+
49+
- [LRU Cache on LeetCode](https://leetcode.com/problems/lru-cache/solutions/244744/lru-cache/)
50+
- [LRU Cache on InterviewCake](https://www.interviewcake.com/concept/java/lru-cache)
51+
- [LRU Cache on Wiki](https://en.wikipedia.org/wiki/Cache_replacement_policies)

‎src/data-structures/lru-cache/README.md

+9-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# Least Recently Used (LRU) Cache
22

3+
_Read this in other languages:_
4+
[한국어](README.ko-KR.md),
5+
36
A **Least Recently Used (LRU) Cache** organizes items in order of use, allowing you to quickly identify which item hasn't been used for the longest amount of time.
47

58
Picture a clothes rack, where clothes are always hung up on one side. To find the least-recently used item, look at the item on the other end of the rack.
@@ -22,7 +25,7 @@ See the `LRUCache` implementation example in [LRUCache.js](./LRUCache.js). The s
2225

2326
![Linked List](./images/lru-cache.jpg)
2427

25-
*Made with [okso.app](https://okso.app)*
28+
_Made with [okso.app](https://okso.app)_
2629

2730
You may also find more test-case examples of how the LRU Cache works in [LRUCache.test.js](./__test__/LRUCache.test.js) file.
2831

@@ -38,11 +41,11 @@ You may also find more test-case examples of how the LRU Cache works in [LRUCach
3841

3942
## Complexities
4043

41-
| | Average |
42-
|---|---|
43-
| Space |`O(n)`|
44-
| Get item | `O(1)` |
45-
| Set item | `O(1)` |
44+
| | Average |
45+
| -------- | ------- |
46+
| Space | `O(n)` |
47+
| Get item | `O(1)` |
48+
| Set item | `O(1)` |
4649

4750
## References
4851

0 commit comments

Comments
 (0)
Please sign in to comment.