[프로그래머스/C++]Lv.2 - 캐시

YH J·2023년 9월 19일
0

프로그래머스

목록 보기
149/168

문제 링크

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문으로 직접 순회하였다.

profile
게임 개발자 지망생

0개의 댓글