https://school.programmers.co.kr/learn/courses/30/lessons/17680
일단 모두 소문자로 바꿔준다.
cities를 for문으로 순회하면서
vec에서 find하였을 때 없으면 answer += 5 하고 캐시 사이즈와 vec의 크기를 비교해서 vec가 아직 캐시 사이즈를 넘지 않았다면 그대로 push_back하고, 넘었다면 가장 마지막으로 들어왔던 begin을 지우고 push_back 한다.
vec에서 find 했을 때 있다면 answer++ 하고 해당 원소를 지운뒤 다시 맨 뒤에 넣는다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(int cacheSize, vector<string> cities) {
int answer = 0;
for(int i = 0; i < cities.size(); i++)
for(int j = 0; j < cities[i].length(); j++)
cities[i][j] = tolower(cities[i][j]);
vector<string> vec;
for(int i = 0; i < cities.size(); i++)
{
auto iter = find(vec.begin(), vec.end(), cities[i]);
if(iter == vec.end())
{
answer += 5;
if(vec.size() < cacheSize)
vec.push_back(cities[i]);
else if(vec.size() == cacheSize && cacheSize > 0)
{
vec.erase(vec.begin());
vec.push_back(cities[i]);
}
}
else
{
answer += 1;
vec.erase(iter);
vec.push_back(cities[i]);
}
}
return answer;
}
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(int cacheSize, vector<string> cities) {
vector <string> q;
int duration = 0;
for(vector <string>::iterator it = cities.begin(); it != cities.end(); it++){
transform(it->begin(), it->end(), it->begin(), ::tolower);
bool flag = false;
for(vector<string>::iterator itt = q.begin(); itt != q.end(); itt++){
if(*itt == *it) {
flag = true;
duration +=1;
q.erase(itt);
q.push_back(*it);
break;
}
}
if(!flag) {
duration +=5;
if(cacheSize != 0 && q.size() >= cacheSize)
q.erase(q.begin());
if(q.size() < cacheSize)
q.push_back(*it);
}
}
return duration;
}
vector를 iter로 순회했다. 동시에 소문자로 바꿔서 검사하였다.
find를 쓰지 않고 for문으로 직접 순회하였다.