전산/Algorithm

[Python] 1차 캐시 - 프로그래머스 / 2018 KAKAO BLIND RECRUITMENT

만두쓰 2023. 7. 31. 21:18

[문제]

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

[주요 알고리즘]

  • LRU란?  가장 오랫동안 참조되지 않은 페이지를 교체하는 알고리즘. 
  • Dictionary의 데이터구조를 사용하여 빠르게 서치한다.
    • 입력 받는 도시의 개수(N)가 100,000개, cachesize(M)는 최대 30으로, O(NM)까지 가능하다.
  • 대소문자 구분이 없어야하기 때문에 모든 도시의 이름을 소문자로 변경한다. 

 

[깨달은 점]

  • 소문자로 변경하는 함수 a.lower() 
  • 다른 풀이를 참고하니 queue를 사용한다. queue 구조를 사용하면 가장 오래된 자료를 곧바로 pop할 수 있다. 대신에 queue에 있는 자료 중 최근에 사용한 자료는 최신화를 시켜줘야하기 때문에 이를 remove하고 다시 append하는 방식으로 구현한다. (참고 : https://eda-ai-lab.tistory.com/503

 

[코드] - 37분 소요

def solution(cacheSize, cities):
    answer = 0
    
    dict = {}
    time = 0
    if cacheSize == 0 : 
        return len(cities) * 5
    for city in cities : 
        city = city.lower()
        ## 1씩 증가하고 시작
        for d in dict : 
            dict[d] += 1
        ## city가 dict에 있을 경우
            ## 그 value값을 0으로 변경
            ## time을 +1
        if city in dict : 
            dict[city] = 0 
            answer += 1
        
        ## city가 dict에 없을 경우
            ## len(dict)가 캐시 크기보다 크다면
                ## 가장 value값이 큰 key 삭제하고 새로 생성
            ## 그렇지 않다면 새로 생성
        else : 
            if len(dict) >= cacheSize : 
                max_city = None
                max_num = 0
                for d in dict : 
                    if not max_city :
                        max_city = d
                        max_num = dict[d]
                    if max_num < dict[d]: 
                        max_city = d
                        max_num = dict[d]
                del dict[max_city]
                
                dict[city] = 0
            else : 
                dict[city] = 0
            answer +=5
    return answer