๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm/์•Œ๊ณ ๋ฆฌ์ฆ˜

[ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค / Java ] 1์ฐจ ์บ์‹œ

728x90
๋ฐ˜์‘ํ˜•

๐Ÿ‘จ‍๐Ÿ’ป ์šฐ์„  ์ด ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ์ „์— ํŽ˜์ด์ง€ ๊ต์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž!

โžก๏ธ ์šด์˜์ฒด์ œ๋Š” ์ฃผ๊ธฐ์–ต์žฅ์น˜๋ณด๋‹ค ๋” ํฐ ์šฉ๋Ÿ‰์˜ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ๊ทธ๋žจ์˜ ์ผ๋ถ€๋งŒ ์ฃผ๊ธฐ์–ต์žฅ์น˜์— ์ ์žฌํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋ฅผ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฒ•์ด๋ผ๊ณ  ํ•œ๋‹ค. ํŽ˜์ด์ง• ๊ธฐ๋ฒ•์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์šด์˜์ฒด์ œ์—์„œ ํ•„์š”ํ•œ ํŽ˜์ด์ง€๊ฐ€ ์ฃผ๊ธฐ์–ต์žฅ์น˜์— ์ ์žฌ๋˜์ง€ ์•Š์•˜์„ ๋•Œ(ํŽ˜์ด์ง€๋ถ€์žฌ) ์–ด๋–ค ํŽ˜์ด์ง€ ํ”„๋ ˆ์ž„์„ ์„ ํƒํ•˜์—ฌ ๊ต์ฒดํ•  ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํŽ˜์ด์ง€ ๊ต์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ ํ•œ๋‹ค.

โ˜‘๏ธ ํ”„๋ ˆ์ž„ : ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ผ์ •ํ•œ ํฌ๊ธฐ๋กœ ๋‚˜๋ˆˆ ๋ธ”๋ก

โ˜‘๏ธ ํŽ˜์ด์ง€ : ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ผ์ •ํ•œ ํฌ๊ธฐ๋กœ ๋‚˜๋ˆˆ ๋ธ”๋ก


๐Ÿ’ก ํŽ˜์ด์ง€ ๊ต์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ข…๋ฅ˜

  • 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

๐Ÿ”ฅ ๋‚ด์ผ ์ฝ”ํ…Œ ๋ณด๋Ÿฌ๊ฐ€๋Š”๋ฐ ํ•ฉ๊ฒฉํ•˜๊ธฐ๋ฅผ!!

728x90
๋ฐ˜์‘ํ˜•