프로그래머스 - [1차] 캐시 (2018 KAKAO BLIND)

Computer Science/Problem Solving

문제 설명

제한사항 및 입출력

풀이

사실 LRU를 LFU로 착각하고 풀이하다가 이상함을 느끼고 고쳤다... 문제를 똑바로 읽자

별다른 알고리즘은 없는 것 같고 큐를 이용한 구현 문제인 것 같다. 주어진 캐시 크기만큼 배열을 유지해주면서 구현해주었다.

내 코드

from collections import deque

def solution(cacheSize, cities):
    if cacheSize == 0:
        return 5 * len(cities)

    ans = 0
    cache = deque([])
    for city in cities:
        # 대소문자 구분 없으니까 정규화
        city = city.lower()

        if city in cache:
            ans += 1
            cache.remove(city)
            cache.append(city)
        else:
            ans += 5
            if len(cache) == cacheSize:
                cache.popleft()

            cache.append(city)
            
	return ans

deque을 이용해서 popleft 하는 과정을 조금이나마 최적화해주었다. 일반적인 배열에서 첫 번째 원소를 제거하는 연산은 O(n)의 시간이 들기 때문에 첫 번째 원소 연산이 O(1)인 deque을 사용하여 풀이했다.

 

시간 복잡도는 모든 cities를 순회하면서 캐시를 순회하며 삭제, 추가해주기 때문에 O(n * m) - n: cities의 크기, m: 캐시의 크기이다.

고찰

아무리 생각해도 remove 연산이 너무 거슬려서 최적화할 수 있는 방법이 없을까 고민하다가 파이썬의 OrderedDict라는 자료구조를 발견했다! 순서를 조작할 수 있는 해시맵이라고 한다. OrderedDict를 사용하면 자연스럽게 마지막 캐시가 가장 마지막으로 사용한 캐시가 되기 때문에 remove해주는 과정이 O(1)로 줄어든다.

# OrderedDict 사용

from collections import OrderedDict

def solution(cacheSize, cities):
    if cacheSize == 0:
        return 5 * len(cities)

    ans = 0
    cache = OrderedDict()

    for city in cities:
        city = city.lower()

        if city in cache:
            ans += 1
            # 가장 마지막 삽입된 원소로 취급
            cache.move_to_end(city)
        else:
            ans += 5
            if len(cache) == cacheSize:
            	# 가장 처음 삽입된 원소 삭제
                cache.popitem(last=False)
            cache[city] = True

    return ans

 

시간 복잡도: O(n)

'Computer Science > Problem Solving' 카테고리의 다른 글

프로그래머스 - 디스크 컨트롤러  (0) 2025.11.20
프로그래머스 - 거리두기 확인하기  (0) 2025.11.18
프로그래머스 - 조이스틱  (0) 2025.11.17
프로그래머스 - 메뉴 리뉴얼  (0) 2025.11.16
프로그래머스 - 서버 증설 횟수  (0) 2025.11.15
'Computer Science/Problem Solving' 카테고리의 다른 글
  • 프로그래머스 - 디스크 컨트롤러
  • 프로그래머스 - 거리두기 확인하기
  • 프로그래머스 - 조이스틱
  • 프로그래머스 - 메뉴 리뉴얼
hojoo
hojoo
그냥 개발이 즐거운 사람
  • hojoo
    dev_record
    hojoo
  • 전체
    오늘
    어제
    • 분류 전체보기 (84)
      • Study (0)
        • 모든 개발자를 위한 HTTP 웹 기본 지식 (0)
        • Real MySQL 8.0 (0)
        • 친절한 SQL 튜닝 (0)
        • 도메인 주도 개발 시작하기 (0)
        • 대규모 시스템 설계 기초 (0)
      • Computer Science (68)
        • Problem Solving (30)
        • Data Structure (4)
        • Spring Boot (14)
        • DB (1)
        • Java (4)
        • OS (3)
        • Server (3)
        • Tech (0)
      • Security (16)
        • Reversing (15)
        • Assembly (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    자료구조
    dreamhack.io
    HTTP
    13265
    서버 증설 횟수
    bean
    리버싱
    15973
    n+1
    x64dbg
    소수상근수
    DB
    백준
    리버싱 핵심원리
    프로그래머스
    Spring boot
    Lena tutorial
    2539
    Reversing
    21278
    PE header
    12033
    DP
    Header
    19622
    servlet
    16946
    n^2 배열 자르기
    9421
    레나 튜토리얼
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
hojoo
프로그래머스 - [1차] 캐시 (2018 KAKAO BLIND)
상단으로

티스토리툴바