프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

LRU(Least Recently Used) 알고리즘

가장 오랫동안 참조되지 않은 페이지를 교체하는 방식

 

기억 공간에 동일한 데이터가 존재하면 해당 데이터를 삭제한 뒤 top에 넣는다.

동일한 데이터가 존재하지 않을 때 기억 공간이 가득 찼다면 가장 오래된 데이터를 삭제한 뒤 새로운 데이터를 넣고

아니라면 바로 데이터를 넣는다. 

 

 

풀이 방법

데이터를 앞/뒤에서 삭제하기 용이한 덱(Deque)을 사용하였다.

 

1. cacheSize가 0이라면 캐시가 없기 때문에 항상 miss이므로 5*cities.size()를 리턴한다.

2. string형 덱 cache를 선언한다.

3. 대소문자 구분을 하지 않으므로 cities[i]를 소문자로 변환시켜준다.

4. miss를 판단할 bool형 cacheMiss를 true로 선언해주고 캐시 내부를 순회하며 cities[i]와 동일한 데이터가 있다면 캐시에서 해당 데이터를 지우고 answer++, cacheMiss = false를 한 다음 break한다.

5. cities[i]를 캐시에 넣는다.

6-1. cacheMiss가 true면 answer에 5를 더해준다.

6-2. cacheMiss가 true고 cache.size()가 cacheSize보다 크면 가장 오래된 데이터를 삭제하고 answer에 5를 더해준다.

7. 반복문이 끝난 후 answer 리턴 

 

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

using namespace std;

int solution(int cacheSize, vector<string> cities) {
    int answer = 0;
    if(cacheSize < 1) return 5 * cities.size();
    
    deque<string> cache;
    
    for(int i = 0; i < cities.size(); i++) {
        transform(cities[i].begin(), cities[i].end(), cities[i].begin(), ::tolower);
        
        bool cacheMiss = true;
        
        for(int j = 0; j < cache.size(); j++) {
            if(cache[j] == cities[i]) {
                cache.erase(cache.begin() + j);
                answer++;
                cacheMiss = false;
                break;
            }
        }
            
        cache.push_back(cities[i]);
        
        if(cacheMiss) {
            if(cache.size() > cacheSize) 
                cache.pop_front();
            answer += 5;
        }
    }
    
    return answer;
}

'프로그래머스 > 2레벨' 카테고리의 다른 글

위장/C++  (0) 2023.01.10
괄호 회전하기/C++  (0) 2023.01.10
H-Index/C++  (0) 2023.01.10
멀리 뛰기/C++  (0) 2023.01.10
점프와 순간 이동/C++  (0) 2023.01.10

+ Recent posts