๐จ๐ป ์ฐ์ ์ด ๋ฌธ์ ๋ฅผ ํ๊ธฐ์ ์ ํ์ด์ง ๊ต์ฒด ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ์์๋ณด์!
โก๏ธ ์ด์์ฒด์ ๋ ์ฃผ๊ธฐ์ต์ฅ์น๋ณด๋ค ๋ ํฐ ์ฉ๋์ ํ๋ก๊ทธ๋จ์ ์คํํ๊ธฐ ์ํด ํ๋ก๊ทธ๋จ์ ์ผ๋ถ๋ง ์ฃผ๊ธฐ์ต์ฅ์น์ ์ ์ฌํ์ฌ ์ฌ์ฉํ๋ค. ์ด๋ฅผ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฒ์ด๋ผ๊ณ ํ๋ค. ํ์ด์ง ๊ธฐ๋ฒ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ ์ด์์ฒด์ ์์ ํ์ํ ํ์ด์ง๊ฐ ์ฃผ๊ธฐ์ต์ฅ์น์ ์ ์ฌ๋์ง ์์์ ๋(ํ์ด์ง๋ถ์ฌ) ์ด๋ค ํ์ด์ง ํ๋ ์์ ์ ํํ์ฌ ๊ต์ฒดํ ๊ฒ์ธ์ง ๊ฒฐ์ ํ๋ ๋ฐฉ๋ฒ์ ํ์ด์ง ๊ต์ฒด ์๊ณ ๋ฆฌ์ฆ์ด๋ผ ํ๋ค.
โ๏ธ ํ๋ ์ : ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ผ์ ํ ํฌ๊ธฐ๋ก ๋๋ ๋ธ๋ก
โ๏ธ ํ์ด์ง : ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ผ์ ํ ํฌ๊ธฐ๋ก ๋๋ ๋ธ๋ก
๐ก ํ์ด์ง ๊ต์ฒด ์๊ณ ๋ฆฌ์ฆ์ ์ข ๋ฅ
- OPT(Optimal Page Replacement) : ์์ผ๋ก ๊ฐ์ฅ ์ค๋ซ๋์ ์ฌ์ฉ๋์ง ์์ ํ์ด์ง ๊ต์ฒด
- FIFO(First In First Out) : ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ฅ ๋จผ์ ๋ค์ด์จ ํ์ด์ง๋ฅผ ๊ฐ์ฅ ๋จผ์ ์ ๊ฑฐ
- LRU(Least Recently Used) : ๊ฐ์ฅ ์ค๋์ ์ ์ฌ์ฉ๋ ํ์ด์ง๋ฅผ ๊ต์ฒด
- LFU(Least Frequently Used) : ์ฌ์ฉ ๋น๋(์ฐธ์กฐ ํ์)๊ฐ ๊ฐ์ฅ ์ ์ ํ์ด์ง ๊ต์ฒด
- MFU(Most Frequently Used) : ์ฌ์ฉ ๋น๋(์ฐธ์กฐ ํ์)๊ฐ ๊ฐ์ฅ ๋ง์ ํ์ด์ง ๊ต์ฒด
- NUR(Not Used Recently) : ์ต๊ทผ์ ์ฌ์ฉํ์ง ์์ ํ์ด์ง ๊ต์ฒด


๐จ๐ป ๋ฌธ์ ์ดํดํ๊ธฐ
์บ์ ์ ์ฅ์ ํฌ๊ธฐ์ ๋์ ์ด๋ฆ๋ค์ ์์ฐจ์ ์ผ๋ก ์ ์ฅํ๋ค. ์์ฐจ์ ์ผ๋ก ์ ์ฅํ๋ฉด์ ์บ์ ํฌ๊ธฐ๊น์ง ๋ฆฌ์คํธ๊ฐ ์ฐจ๋ฉด ๋น๊ต๋ฅผ ํ๋ฉด์ ๊ฐ์ผ๋ฉด ํ์ด์ง ๊ต์ฒด ํ์(cache hit)์ ++ ํด์ค๋ค. ๋ค๋ฅด๋ฉด cache miss += 5๋ฅผ ํด์ค๋ค. ์ฌ์ง์์ด ๋ฆฌ์คํธ์ ๋งต์ ์ฌ์ฉํด๋ณด์!
if(cacheSize == 0) {
return 5 * cities.length;
}
int time = 0;
List<String> cache = new LinkedList<>();
for(String city : cities) {
city = city.toLowerCase();
if(cache.contains(city)) {
cache.remove(city);
cache.add(city);
time++;
} else {
if(cache.size() == cacheSize) {
cache.remove(0);
}
cache.add(city);
time += 5;
}
}
return time;
โ๏ธ ArrayList๊ฐ ์๋ LinkedList๋ฅผ ์ฌ์ฉํ ์ด์ ๋ ๋ ธ๋ ๊ธฐ๋ฐ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก, ๊ฐ ์์๊ฐ ๋ค์ ์์์ ๋ํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ์ญ์ ํ ๋๋ ํด๋น ๋ ธ๋๋ฅผ ์ฐพ์ ์ฐ๊ฒฐ๋ง ๋์ผ๋ฉด ๋๊ณ ์ถ๊ฐ๋ ๊ธฐ์กด์ ๋ง์ง๋ง ์์๋ง ์ ์์๋ฅผ ๊ฐ๋ฆฌํค๋ฉด ๋๊ธฐ ๋๋ฌธ์ O(1) ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
โ๏ธ ์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ง ์ ์๋ค.
[jeju]
5
[jeju, pangyo]
10
[jeju, pangyo, seoul]
15
[pangyo, seoul, newyork]
20
[seoul, newyork, la]
25
[newyork, la, jeju]
30
[la, jeju, pangyo]
35
[jeju, pangyo, seoul]
40
[pangyo, seoul, newyork]
45
[seoul, newyork, la]
50
if(cacheSize == 0) return 5 * cities.length;
LinkedHashMap<String, Integer> cache = new LinkedHashMap<String, Integer>(cacheSize, 0.75f, true) {
protected boolean removeEldestEntry(Map.Entry<String, Integer> eldest) {
return size() > cacheSize;
}
};
int time = 0;
for(String city : cities) {
city = city.toLowerCase();
if(cache.containsKey(city)) {
time++;
} else {
time += 5;
}
cache.put(city, 1);
}
return time;
โ๏ธ 0.75f : ๋ก๋ ํฉํฐ(load factor)๋ก ๋ด๋ถ์ ์ผ๋ก ์ ์ฅ์ ํ์ฅ์ด ํ์ํ ์์ ์ ๊ฒฐ์ ํ๋ค. 0.75๋ ๊ธฐ๋ณธ๊ฐ์ด๋ค.
โ๏ธ true : ์ ์จ ์์(access-older)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์์ ์์๋ฅผ ์ ์งํ๋ค๋ ๊ฒ์ด๋ค. (false : ์ฝ์ ์์๋ฅผ ์ ์ง)
โ๏ธ removeEldestEntry ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋
- LinkedHashMap ์์ ๊ฐ์ฅ ์ค๋๋ ํญ๋ชฉ์ ์ ๊ฑฐํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ๋ฉ์๋
- ์ด ๋ฉ์๋๋ ๋งต์ ์ ํญ๋ชฉ์ด ์ถ๊ฐ๋ ๋๋ง๋ค ํธ์ถ๋๋ค.
- eldest ๋งค๊ฐ๋ณ์๋ ํ์ฌ ๋งต์์ ๊ฐ์ฅ ์ค๋๋ ํญ๋ชฉ์ ๋ํ๋ธ๋ค.
// eldest ๋งค๊ฐ๋ณ์ ๊ฒฐ๊ณผ
jeju=1
jeju=1
jeju=1
jeju=1
pangyo=1
seoul=1
newyork=1
la=1
jeju=1
pangyo=1
- return size() > cacheSize ๋ ๋งต์ ํฌ๊ธฐ๊ฐ ์บ์ ํฌ๊ธฐ๋ฅผ ์ด๊ณผํ๋ฉด ๊ฐ์ฅ ์ค๋๋ ํญ๋ชฉ์ ์ ๊ฑฐํ๋ผ๋ ๊ฒ์ ์๋ฏธ
// return size() > cacheSize ๊ฒฐ๊ณผ
false
false
false
true
true
true
true
true
true
true
โก๏ธ LRU ๋ก์ง์ ํต์ฌ
//์บ์ ๊ฒฐ๊ณผ
{jeju=1}
5
{jeju=1, pangyo=1}
10
{jeju=1, pangyo=1, seoul=1}
15
{pangyo=1, seoul=1, newyork=1}
20
{seoul=1, newyork=1, la=1}
25
{newyork=1, la=1, jeju=1}
30
{la=1, jeju=1, pangyo=1}
35
{jeju=1, pangyo=1, seoul=1}
40
{pangyo=1, seoul=1, newyork=1}
45
{seoul=1, newyork=1, la=1}
50
๐ฅ ๋ด์ผ ์ฝํ ๋ณด๋ฌ๊ฐ๋๋ฐ ํฉ๊ฒฉํ๊ธฐ๋ฅผ!!
'Algorithm > ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [ ๋ฐฑํธ๋ํน ] N๊ณผ M (0) | 2025.10.26 |
|---|---|
| [Java / Javascript] HashSet, HashMap (0) | 2024.03.13 |
| ์คํ(Stack) (0) | 2023.11.03 |
| ์ ํ ๊ฒ์๊ณผ ์ด์ง ๊ฒ์ (1) | 2023.11.01 |
| [์๊ณ ๋ฆฌ์ฆ/DFS] ๊น์ด ์ฐ์ ํ์(Depth First Search) (0) | 2023.10.30 |