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

프로그래머스 - 캐쉬 문제 (자바)

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

큐, 리스트 등의 자료구조를 통해서 해결 가능한 문제

저는 큐를 선택했습니다.

첫번째로 들어온 값을 제거하는 부분에서

큐는 poll을, 리스트라면 remove(0)을 이용하면됩니다.

 

 

주의점

캐쉬 사이즈 0인 경우를 고려 해야합니다.

저의 경우 0 인경우 전체 miss의므로 *5를 리턴하도록 하였습니다.

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

// 프로그래머스 캐쉬 문제 
class Cache {
    public int solution(int cacheSize, String[] cities) {
        Queue<String> q = new LinkedList<>();
        int cityIdx = 0;
        int answer = 0;

        // 캐쉬 사이즈가 0 이면 모두 miss 처리
        if (cacheSize == 0) return cities.length * 5;

        while (true) {
            if(cityIdx == cities.length) break;

            // 대소문자 구분 x 이므로 소문자로 통일
            String now = cities[cityIdx++].toLowerCase();

            // 포함된 경우
            if(q.contains(now)) {
                // q의 맨 뒤로 보내기 위해서 제거 후 추가
                q.remove(now);
                q.offer(now);
                answer++;
            }
            else {
                // 캐쉬 사이즈가 꽉차는 경우는 하나 제거
                if(q.size() == cacheSize) q.poll();

                // 포함되지않은 경우는 무조건 miss 이므로
                q.offer(now);
                answer += 5;
            }
        }
        return answer;
    }
}