코딩 테스트/프로그래머스

[프로그래머스][LEVEL2] 캐시 - JAVA

갓생사는 김초원의 개발 블로그 2021. 7. 22. 07:49

[문제]

  • 2018 KAKAO BLIND RECRUITMENT 출제 

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

 

코딩테스트 연습 - [1차] 캐시

3 ["Jeju", "Pangyo", "Seoul", "NewYork", "LA", "Jeju", "Pangyo", "Seoul", "NewYork", "LA"] 50 3 ["Jeju", "Pangyo", "Seoul", "Jeju", "Pangyo", "Seoul", "Jeju", "Pangyo", "Seoul"] 21 2 ["Jeju", "Pangyo", "Seoul", "NewYork", "LA", "SanFrancisco", "Seoul", "Ro

programmers.co.kr

 

[풀이]

<사전 지식>

1. LRU 캐시 알고리즘의 동작 방법을 알고 있어야 한다. 

https://programmer-chocho.tistory.com/14

 

LRU(Least Recently Used) 캐시 알고리즘

LRU 캐시 알고리즘 - Least Recently Used (가장 최근에 사용한) - 가장 오래전에 참조된, 덜 최근에 사용된 데이터를 내쫓는다. 최근에 참조된 것이 가까운 미래에 참조될 가능성이 높은 성질을 이용한

programmer-chocho.tistory.com

 

2. 캐시 용어

  • Cache Hit: CPU가 참조하고자 하는 메모리가 캐시안에 존재하는 경우
  • Cache Miss: CPU가 참조하고자 하는 메모리가 캐시안에 없는 경우

 

[코드]

- Queue를 이용했다. 

package com.algorithm.kakaoTest.three;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 캐시
 * 소요시간: 21분 36초
 */
public class Test01 {
    public static void main(String[] args) {
        int cacheSize = 2;
        String[] cities = {"Jeju", "Pangyo", "NewYork", "newyork"};

        int answer = solution(cacheSize, cities);
        System.out.println(answer);
    }

    public static int solution(int cacheSize, String[] cities) {
        int answer = 0;
        Queue<String> cache = new LinkedList<>();

        // 캐시 크기가 0이면 항상 캐시 miss이므로 모든 수행시간이 5초임
        if (cacheSize == 0) {
            return cities.length * 5;
        }

        for (int i = 0; i < cities.length; i++) {
            String city = cities[i].toLowerCase();

            if (!cache.contains(city)) { // 캐시 miss
                answer = answer + 5;
                if (cache.size() == cacheSize) {
                    cache.poll();
                }
            } else { // 캐시 hit
                answer = answer + 1;
                cache.remove(city);
            }
            cache.add(city);
        }
        return answer;
    }
}