1 분 소요

Question

Q Q2


Solution

  • cities에 대한 for 루프를 하여 각 조건들에 따라 다르게 동작한다.
    1. city가 caching에 존재한다면 hit -> 해당 city를 제거하고 다시 push 한다.
    2. city가 존재하지 않는다 miss ->
      caching이 가득찬 상태면 가장 오래된 (맨 앞) city를 제거 후 push,
      빈 공간이 있다면 push 한다.
  • 같은 city지만 대소문자가 다르게 입력이 주어질 수 있기 때문에 소문자로 통일 시킨다.
  • caching의 size가 0에 대한 예외처리를 해준다.

Cord

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

using namespace std;

// 모두 소문자로 변환
string getLowerString(string city)
{
    string temp = "";
    for (char& c : city) { temp += tolower(c); }
    return temp;
}

int solution(int cacheSize, vector<string> cities)
{
    // miss 일때 push (가득찬 경우도 고려),
    // hit 일때 idx를 찾아 제거후 다시 push,
    // 때문에 LRU를 vector로 구현 필요.
    vector<string> caching;
    int answer = 0;

    if (cacheSize == 0) { return cities.size() * 5; }

    for (int i = 0; i < cities.size(); ++i)
    {
        // 소문자로 이름 통일 시키기
        string unity = getLowerString(cities[i]);

        // caching에 city가 있는지 확인
        auto it = find(caching.begin(), caching.end(), unity);

        // hit 일 경우 - 제거후 다시 넣기
        if (it != caching.end())
        {
            answer += 1;
            caching.erase(it);
            caching.push_back(unity);
        }
        // miss 일 경우
        else
        {
            answer += 5;

            // caching이 가득차있다면 맨 앞(가장 오래된 데이터) 제거
            if (caching.size() == cacheSize) { caching.erase(caching.begin()); }
            caching.push_back(unity);
        }
    }

    return answer;
}

Result

Result