[Programmers] Level2 : [1차] 캐시
Question
Solution
- cities에 대한 for 루프를 하여 각 조건들에 따라 다르게 동작한다.
- city가 caching에 존재한다면 hit -> 해당 city를 제거하고 다시 push 한다.
- 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;
}