Judge

Programmers - 캐시

깡구_ 2022. 6. 25. 23:40

title: Programmers - 캐시
date: 2022-06-25
tags:

  • Algorithm




https://programmers.co.kr/learn/courses/30/lessons/17680


문제 요약

LRU 방식의 캐시 크기와 도시 리스트가 주어진다. Cache hit일 경우 시간이 1, miss일 경우 5가 소요된다. 주어진 도시와 캐시들을 이용하였을 때 소요 시간을 구하여 return한다.


문제 풀이

LRU 캐시 적용이므로 앞에서부터 순차적으로 확인하면 된다.
캐시를 저장할 string vector 한 개, 언제 사용되었는지 저장할 int 배열 한 개 이용한다.
Miss라면 가장 값이 작은(저장이 제일 오래전에 이루어진) 캐시의 값을 바꾼다.

대문자와 소문자의 구분이 없고, 일일히 대치하는 for문 대신 실무에서 이용할만한 방법을 찾았다.
How to convert an instance of std::string to lower case
Java의 toLowerCase 같은 함수가 없고 각 character를 순차적으로 확인하며 대치해주어야 한다.
for문 대신 대치를 해줄 함수를 선언하고, 이 함수를 transform의 파라미터로 넣어주면 알아서 처리가 된다.

transform 함수의 경우 파라미터가 4개 혹은 5개이다.

4개일 경우, (Start , End , Save, Function) - Start부터 End 전까지 Function의 파라미터로 사용하여 결과를 Save부터 순서대로 저장한다.
5개일 경우, (Start1 , End1 , Start2 , Save, Function) - Start1부터 End1 전까지 Function의 첫 번째 파라미터로, Start2부터 같은 개수를 Function의 두 번째 파라미터로 사용하여 결과를 Save부터 순서대로 저장한다.

간단히 Function의 파라미터의 개수에 따라 두 가지로 나누어 사용할 수 있는 것이다.
보통 PS의 경우 transform 함수 대신 for문으로 사용하는 편이지만, 실무에서 사용하기에는 정말 좋은 함수인 것 같다.

추가적으로, LRU 방식은 결국 queue와 동일한 방식이다.
그렇기에 이렇게 2개의 배열을 이용하기 보다는 queue를 도입하는 것이 훨씬 좋은 프로그램이라 생각한다.


프로그램

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

using std :: vector ;
using std :: string ;

char chToLowerCase ( char ch )
{
    if ( 'a' <= ch )
        ch -= 32 ;

    return ch ;
}

int solution ( int cacheSize , vector < string > cities )
{
    int answer = 0 ;
    vector < string > vCache ;
    vCache.resize ( 30 ) ;
    int irgCache [ 30 ] = { 0 , } ;
    string * strpTemp = cities.data () ;
    string * strpCache = vCache.data () ;
    int iCitySize = cities.size () ;
    bool bCacheMiss = true ;



    std :: fill ( irgCache , irgCache + 30 , -1 ) ;    // Fill with -1 to replace first

    if ( 0 == cacheSize )
        return 5 * iCitySize ;

    for ( int i = 0 ; i < iCitySize ; ++i )            // Each city
    {
        string strLower = strpTemp [ i ] ;
        std :: transform ( strLower.begin () , strLower.end () , strLower.begin () , chToLowerCase ) ;
        bCacheMiss = true ;

        for ( int j = 0 ; j < cacheSize ; ++j )
        {
            if ( 0 == strLower.compare ( strpCache [ j ] ) )        // If hit
            {
                bCacheMiss = false ;
                ++ answer ;
                irgCache [ j ] = i ;

                break ;
            }
        }

        if ( bCacheMiss )
        {
            int iIndex = 0 ;

            for ( int j = 1 ; j < cacheSize ; ++j )
            {
                if ( irgCache [ j ] < irgCache [ iIndex ] )
                {
                    iIndex = j ;
                }
            }

            irgCache [ iIndex ] = i ;
            strpCache [ iIndex ] = strLower ;

            answer += 5 ;
        }
    }


    return answer ;
}

'Judge' 카테고리의 다른 글

Programmers - 괄호 변환  (0) 2022.06.26
Programmers - 전력망을 둘로 나누기  (0) 2022.06.26
Programmers - 피로도  (0) 2022.06.25
Programmers - 후보키  (0) 2022.06.24
Programmers - 다리를 지나는 트럭  (0) 2022.06.24