현대타운301 2024. 3. 22. 19:08

     


     

    문제 설명

     

     

     

    입출력 예시

     

     

    요약

    캐시에 저장된 문자열과 비교(대소문자 구분x)해서 있다면 hit 없다면 miss 방식은 LRU

     


     

    풀이

     

    접근 방식

    1. 캐시 크기로 분기점 생성

      → 캐시 사이즈가 0이라면 all miss

     

    2. 캐시에 저장된 문자열과 비교

      → equalsIgnoreCase()를 통해 대소문자 구분 없이 비교

     

    3. hit의 경우(= 캐시에 존재한다면)

      → remove()와 add()로 LRU 방식 구현

     


     

    코드리뷰

     

    import java.util.*;
    
    class Solution {
        public int solution(int cacheSize, String[] cities) {
            List<String> list = new ArrayList<>();
            int answer = 0;
            boolean find;
            for(int i = 0; i < cities.length; i++) {
                if(cacheSize == 0) {
                    answer += 5;    // 캐시 사이즈가 0인 경우엔 all miss
                } else {
                    find = false;
                    for(int j = 0; j < list.size(); j++) {
                        if(list.get(j).equalsIgnoreCase(cities[i])) {   // 캐시에 저장된 도시라면
                            find = true;	// 찾았음을 의미하는 find
                            list.remove(j);
                            list.add(0, cities[i]);
                            answer += 1;	// hit
                            break;
                        }
                    }
                    if(!find) { // 캐시에 없는 도시인 경우
                        if(list.size() < cacheSize) {   // 캐시에 들어갈 공간이 있으면
                            answer += 5;	// miss
                            list.add(0, cities[i]);
                        } else {    // 캐시에 들어갈 공간이 없다면
                            answer += 5;
                            list.add(0, cities[i]);
                            list.remove(list.size()-1);	// 마지막 문자열 제거
                        }
                    }
                }
            }
            return answer;
        }
    }