๐Ÿ“ฆ Chango/๐Ÿงฉ Data Structure

[LRU ์บ์‹œ๊ต์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค 17680 : ์บ์‹œ

์„ ๋‹ฌ 2022. 8. 24. 01:57
๋ฐ˜์‘ํ˜•

https://school.programmers.co.kr/learn/courses/30/lessons/17680?language=cpp# 

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

์บ์‹œ

์ง€๋„๊ฐœ๋ฐœํŒ€์—์„œ ๊ทผ๋ฌดํ•˜๋Š” ์ œ์ด์ง€๋Š” ์ง€๋„์—์„œ ๋„์‹œ ์ด๋ฆ„์„ ๊ฒ€์ƒ‰ํ•˜๋ฉด ํ•ด๋‹น ๋„์‹œ์™€ ๊ด€๋ จ๋œ ๋ง›์ง‘ ๊ฒŒ์‹œ๋ฌผ๋“ค์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ฝ์–ด ๋ณด์—ฌ์ฃผ๋Š” ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋‹ค.
์ด ํ”„๋กœ๊ทธ๋žจ์˜ ํ…Œ์ŠคํŒ… ์—…๋ฌด๋ฅผ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ๋Š” ์–ดํ”ผ์น˜๋Š” ์„œ๋น„์Šค๋ฅผ ์˜คํ”ˆํ•˜๊ธฐ ์ „ ๊ฐ ๋กœ์ง์— ๋Œ€ํ•œ ์„ฑ๋Šฅ ์ธก์ •์„ ์ˆ˜ํ–‰ํ•˜์˜€๋Š”๋ฐ, ์ œ์ด์ง€๊ฐ€ ์ž‘์„ฑํ•œ ๋ถ€๋ถ„ ์ค‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฒŒ์‹œ๋ฌผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ถ€๋ถ„์˜ ์‹คํ–‰์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.
์–ดํ”ผ์น˜๋Š” ์ œ์ด์ง€์—๊ฒŒ ํ•ด๋‹น ๋กœ์ง์„ ๊ฐœ์„ ํ•˜๋ผ๊ณ  ๋‹ฆ๋‹ฌํ•˜๊ธฐ ์‹œ์ž‘ํ•˜์˜€๊ณ , ์ œ์ด์ง€๋Š” DB ์บ์‹œ๋ฅผ ์ ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์‹œ๋„ํ•˜๊ณ  ์žˆ์ง€๋งŒ ์บ์‹œ ํฌ๊ธฐ๋ฅผ ์–ผ๋งˆ๋กœ ํ•ด์•ผ ํšจ์œจ์ ์ธ์ง€ ๋ชฐ๋ผ ๋‚œ๊ฐํ•œ ์ƒํ™ฉ์ด๋‹ค.

์–ดํ”ผ์น˜์—๊ฒŒ ์‹œ๋‹ฌ๋ฆฌ๋Š” ์ œ์ด์ง€๋ฅผ ๋„์™€, DB ์บ์‹œ๋ฅผ ์ ์šฉํ•  ๋•Œ ์บ์‹œ ํฌ๊ธฐ์— ๋”ฐ๋ฅธ ์‹คํ–‰์‹œ๊ฐ„ ์ธก์ • ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ ํ˜•์‹

  • ์บ์‹œ ํฌ๊ธฐ(cacheSize)์™€ ๋„์‹œ์ด๋ฆ„ ๋ฐฐ์—ด(cities)์„ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.
  • cacheSize๋Š” ์ •์ˆ˜์ด๋ฉฐ, ๋ฒ”์œ„๋Š” 0 โ‰ฆ cacheSize โ‰ฆ 30 ์ด๋‹ค.
  • cities๋Š” ๋„์‹œ ์ด๋ฆ„์œผ๋กœ ์ด๋ค„์ง„ ๋ฌธ์ž์—ด ๋ฐฐ์—ด๋กœ, ์ตœ๋Œ€ ๋„์‹œ ์ˆ˜๋Š” 100,000๊ฐœ์ด๋‹ค.
  • ๊ฐ ๋„์‹œ ์ด๋ฆ„์€ ๊ณต๋ฐฑ, ์ˆซ์ž, ํŠน์ˆ˜๋ฌธ์ž ๋“ฑ์ด ์—†๋Š” ์˜๋ฌธ์ž๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋„์‹œ ์ด๋ฆ„์€ ์ตœ๋Œ€ 20์ž๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

์ถœ๋ ฅ ํ˜•์‹

  • ์ž…๋ ฅ๋œ ๋„์‹œ์ด๋ฆ„ ๋ฐฐ์—ด์„ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•  ๋•Œ, "์ด ์‹คํ–‰์‹œ๊ฐ„"์„ ์ถœ๋ ฅํ•œ๋‹ค.

์กฐ๊ฑด

  • ์บ์‹œ ๊ต์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ LRU(Least Recently Used)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • cache hit์ผ ๊ฒฝ์šฐ ์‹คํ–‰์‹œ๊ฐ„์€ 1์ด๋‹ค.
  • cache miss์ผ ๊ฒฝ์šฐ ์‹คํ–‰์‹œ๊ฐ„์€ 5์ด๋‹ค.

 

ํ’€์ด

 

์กฐ๊ฑด์— ์ฃผ์–ด์ง„ ์บ์‹œ๊ต์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜ LRU ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ ์ธ ์ง€์‹์ด ์žˆ์–ด์•ผํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค. ๋„ˆ๋ฌดํ•ด ;(

 

https://github.com/seondal/Daily_CS/issues/9

 

์บ์‹œ ๊ต์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š” · Issue #9 · seondal/Daily_CS

์บ์‹œ(ํŽ˜์ด์ง€) ๊ต์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€ LRU (Last Recently Used) ์‚ฌ์šฉ์ž์—๊ฒŒ ๋น ๋ฅด๊ฒŒ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์บ์‹œ์—์„œ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„๋•Œ, ๊ฐ€์žฅ ์˜ค๋ž˜์ „์— ์‚ฌ์šฉ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ƒˆ๋กœ์šด

github.com

 

#include <string>
#include <vector>
#include <deque>
#include <algorithm>

using namespace std;

deque<string> cache;

int solution(int cacheSize, vector<string> cities) {
    int answer = 0;

    if(cacheSize == 0) return answer = 5*cities.size();
    
    for(string input : cities) {
        transform(input.begin(), input.end(), input.begin(), ::tolower);
        
        auto number = find(cache.begin(), cache.end(), input);
        
        if(number != cache.end()) {
            // Hit
            cache.erase(number);
            answer++;
        } else {
            // Miss
            if(cache.size() == cacheSize)
                cache.pop_front();
            answer += 5;
        }
        
        cache.push_back(input);
    }
    
    return answer;
}

https://school.programmers.co.kr/learn/courses/30/lessons/17680/solution_groups?language=cpp&type=my

 

์‹œํ–‰์ฐฉ์˜ค

์ฒ˜์Œ์—๋Š” ์บ์‹œํฌ๊ธฐ 0์ธ๊ฒฝ์šฐ๋ฅผ ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ,

๊ทธ๋žฌ๋”๋‹ˆ ํ…Œ์ŠคํŠธ7๊ณผ ํ…Œ์ŠคํŠธ17์—์„œ ์‹คํŒจ(signal: segmentation fault (core dumped)) ๊ฐ€ ๋–ด๋‹ค

 ํ…Œ์ŠคํŠธ 6์—์„œ ์บ์‹œํฌ๊ธฐ๊ฐ€ 0์ž„์—๋„ ๋‹ต์€ ์ž˜ ๋‚˜์™”๋Š”๋ฐ.. ์ด์œ ๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค.. ใ… 

 

https://school.programmers.co.kr/questions/19566

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

๋‚˜์ฒ˜๋Ÿผ 7๋ฒˆ 17๋ฒˆ๋งŒ ํ‹€๋ฆฌ๋Š” ๊ฒฝ์šฐ์˜ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ๋Š”๋ฐ..

๋ณธ ๊ธ€์† ๋ฐ˜๋ก€ ํ…Œ์ผ€๋„ ์ž˜ ํ†ต๊ณผํ•˜๊ณ  ์ œ์ถœ๋งŒํ•˜๋ฉด ํ‹€๋ฆฌ๋Š”..์ƒํ™ฉ..ใ… ใ… 

 

#include <string>
#include <vector>
#include <deque>
#include <algorithm>

using namespace std;

deque<string> cache;

int solution(int cacheSize, vector<string> cities) {
    int answer = 0;

    for(string input : cities) {
        transform(input.begin(), input.end(), input.begin(), ::tolower);
        
        auto number = find(cache.begin(), cache.end(), input);
        
        if(number != cache.end()) {
            // Hit
            cache.erase(number);
            answer++;
        } else {
            // Miss
            if(cache.size() == cacheSize)
                cache.pop_front();
            answer += 5;
        }
        
        cache.push_back(input);
    }
    
    return answer;
}
๋ฐ˜์‘ํ˜•