알고리즘

프로그래머스 1차 캐시 (JAVA)

박카스마시며코딩 2022. 6. 9. 14:29

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

 

저는 투포인터 개념을 활용하여 문제를 해결하였습니다.

for문을 통해 각각의 도시이름이 캐시에 있는지를 진행하였습니다.

저는 prevIndex를 통해 이전 인덱스를 저장하였고, 만약 map의 size가 cacheSize보다 크다면 previndex를 앞으로 진행하면서 해당 값을 하나씩 줄여나갔습니다. 이때 cacheSize가 0에 대해 처리해야하기 때문에 캐시에 넣을 때고 cacheSize를 고려하였고, while문에서도 0일때 무한문이 되지 않도록 구현하였습니다.

 

import java.util.*;
class Solution {
    private static final int CACHE_HIT_TIME = 1;
    private static final int CACHE_MISS_TIME = 5;
    public int solution(int cacheSize, String[] cities) {
        int answer = 0;
        Map<String,Integer> cache = new HashMap<>();
        int prevIndex = 0;
        for(int i = 0 ; i < cities.length ; i++){
            String now = cities[i].toUpperCase();
            if(cache.getOrDefault(now,0) > 0){
                answer += CACHE_HIT_TIME;
            }else{
                answer += CACHE_MISS_TIME;
                while(cache.size() >= Math.max(cacheSize,1) ) {
                    String prev = cities[prevIndex++].toUpperCase();    
                    int cnt = cache.getOrDefault(prev,0);
                    if(cnt == 0){
                        continue;
                    }
                    cnt--;
                    if(cnt == 0){
                        cache.remove(prev);
                    }else{
                        cache.put(prev,cnt);
                    }
                }
            }
            if(cacheSize != 0){
                int cnt = cache.getOrDefault(now,0);
                cache.put(now,cnt+1);
            }
        }
        return answer;
    }
}