[프로그래머스] 캐시 파이썬

FFTL:)·2021년 6월 28일
0

캐시 ( https://programmers.co.kr/learn/courses/30/lessons/17680 )

처음에는 문제에 대해서 이해하는데에 오랜 시간이 걸렸던 문제입니다. 문제를 이해하고 나니 해결 자체에는 오랜 시간이 걸리지 않았습니다.

문제 해결

  • 문제에서 주어진 LRU(Least Recently Used)를 이해하고 있다면 쉽게 해결할 수 있습니다.
  • 도시이름의 비교에 대소문자가 구별이 없다는 조건이 있으므로 cities를 모두 소문자로 바꾸어 비교하기 편하도록 만들어 주었습니다.
  • 그리고 cache 배열을 만들어 도시이름을 넣어주다가 캐시크기를 넘었을 경우 LRU 알고리즘을 따라 cache의 도시이름의 교체를 반복해주며 진행합니다.
#LRU 사용한지 가장 오래된 것을 제거한다.

def solution(cacheSize, cities):
    answer = 0;
    
    #캐시크기가 0이 아닐 때
    if cacheSize != 0:
        cache = [];		#캐시를 표현해 줄 배열
        
        #cities의 도시이름들을 모두 소문자로 변경해 줍니다.
        for i in range(len(cities)):
            cities[i] = cities[i].lower();
        
        #cities를 while을 이용해 탐색합니다.
        while cities:
            #cities의 이름을 pop(0)을 이용하여 하나씩 꺼내며 판단을 시작합니다.
            name = cities.pop(0);
            
            #만약 캐시 안에 이번 도시이름이 존재한다면 해당 도시이름을 가장 최근에 담았다고 변경해 줍니다. (이번 도시 이름을 가장 최근으로 다시 올려줌)
            if name in cache:       
                cache.remove(name);
                cache.append(name);
                answer += 1;	#캐시 히트이므로 1 증가
            
            #도시이름이 캐시 안에 존재하지 않는다면 
            else:
            	
                #캐시크기가 이미 꽉 차있다면 가장 마지막에 사용한 것(index가 0인 것)을 제거하고 캐시에 담아줍니다.
                if len(cache) == cacheSize:
                    cache.pop(0);
                    cache.append(name);
                    answer += 5;	# 캐시 미스이므로 5 증가
                
                #꽉 차있지 않다면 마지막에 담아주기만 합니다.
                else:
                    cache.append(name);
                    answer += 5;	# 캐시 미스이므로 5 증가
    
    #만약 캐시크기가 0일경우 모두 캐시 미스이므로 전체개수에 5를 곱해서 답을 구해줍니다.
    else:
        answer = len(cities) * 5;
        
    return answer;

=> 문제 이해가 조금 어려웠을 뿐 풀이가 괜찮았던 문제였습니다.

profile
생각하는 개발자가 되자!

0개의 댓글