[프로그래머스] 캐시



Programmers - [2018 KAKAO BLINE RECRUITMENT] 캐시




사용 언어 - C++

소요 시간 - 42분

정답 여부 - O




문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/17680



문제 요약

  1. 캐시 사이즈와 도시 이름이 담긴 배열이 주어짐
  2. 도시 이름은 대소문자 구분 없이
  3. 캐시 교체 알고리즘 : LRU(Least Recently Used)
  4. 캐시 히트 : 실행시간 += 1
  5. 캐시 미스 : 실행시간 += 5
  6. return 실행시간

ex)
캐시 사이즈가 4인 캐시에
🌙❤️⭐🌟 순서로 저장되어 있다고 할 때,
🌙를 넣는다고 가정하면, 캐시 내부에 🌙가 있기 때문에 캐시 히트,
❤️⭐🌟🌙 이렇게 저장이 됨. 실행시간 + 1

🌙❤️⭐🌟 순서로 저장되어 있다고 할 때,
🌕를 넣는다고 가정하면, 캐시 내부에 🌕가 없기 때문에 캐시 미스,
❤️⭐🌟🌕 이렇게 저장이 됨.
실행시간 + 5




최종 코드

#include <string>
#include <vector>
#include <list>
#include <algorithm>

using namespace std;

void ToUpper(vector<string>& InString)
{
    for(int i = 0; i < InString.size(); i++)
        for(int j = 0; j < InString[i].length(); j++)
            InString[i][j] = toupper(InString[i][j]);
    
    return;
}

int solution(int cacheSize, vector<string> cities) {
    int answer = 0;
    
    ToUpper(cities);
    
    list<string> caches;
    
    for(int i = 0; i < cities.size(); i++)
    {
        list<string>::iterator iter = find(caches.begin(), caches.end(), cities[i]);
        
        bool cacheMiss = (iter == caches.end());
        
        if(cacheMiss)
        {
            if(caches.size() < cacheSize)
            {
                caches.push_back(cities[i]);
            }
            else if(cacheSize > 0 && caches.size() == cacheSize)
            {
                caches.erase(caches.begin());
                caches.push_back(cities[i]);
            }
            
            answer += 5;
        }
        else
        {
            caches.erase(iter);
            caches.push_back(cities[i]);
            answer += 1;
        }
    }
    
    return answer;
}




트러블 슈팅

  1. 문제가 발생한 건 아니지만, 처음 풀어보는 류의 문제여서 생각하는데 조금 시간이 걸렸다




문제 풀이 후 소감

  • 큐로 풀지, 리스트로 풀지 고민하다가 원소의 삽입, 삭제가 빠른 리스트로 풀어보기로 했다. 리스트는 코테에서 처음 써봐서 아직은 익숙하지 않아 문제를 푸는 데 생각보다 오랜 시간이 걸렸다. 다음에 풀 때는 조금 덜 걸리겠지…?