ALGORITHM/PROGRAMMERS

[프로그래머스] 캐시 (2018 KAKAO BLIND RECRUITMENT)

0298 2021. 1. 5. 14:35

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, Rome, Paris, Jeju, NewYork, Rome] 60 5 [Jeju, Pangyo, S

programmers.co.kr

2021-01-05


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.util.ArrayList;
 
public class Solution17680 {
    public static int solution(int cacheSize, String[] cities) {
        if(cacheSize == 0return 5*(cities.length);
 
        int answer = 0;
            
        ArrayList<String> list = new ArrayList<>();
        for(int i = 0; i < cities.length; i++) cities[i] = cities[i].toLowerCase();
        
        for(int i = 0; i < cities.length; i++) {
            if(list.contains(cities[i])) {
                answer++;
                list.remove(cities[i]);
                list.add(cities[i]);
            }  else if(list.size() < cacheSize) {
                list.add(cities[i]);
                answer+=5;
            } else if(list.size() == cacheSize) {
                list.remove(0);
                list.add(cities[i]);
                answer+=5;
            }
        }
        return answer;
    }
    public static void main(String[] args) {
        String c[] = {"Jeju""Pangyo""Seoul""NewYork""LA""Jeju""Pangyo""Seoul""NewYork""LA"};
        System.out.println(solution(3, c));
    }
}
cs

#문제풀이

문제에 따로 설명이 없어서, LRU 알고리즘, cache hit, cache miss에 대해서 간단하게 적어본다.
LRU 알고리즘 (Least Recently Used)은 캐시에서 메모리를 다루는 알고리즘이다. 캐시는 문제에서 cacheSize처럼 제한된 양이 있다. 그래서 최근에 사용된적 없는 캐시의 메모리부터 삭제하여 데이트를 갱신시켜준다.
cache hit은 참조하고자 하는 메모리가 이미 캐시에 존재함을 의미한다.
cache miss는 참조하고자 하는 메모리가 캐시에 존재하지 않음을 의미한다.


1. cities 배열에 있는 값들을 다 lowercase로 통일시켰고, Arraylist를 이용하여 문제를 풀었다.

2. cities 배열을 돌면서, 3가지 케이스로 나눠서 생각했다.

3. 첫번째, 이미 list 안에 값이 들어가 있는 경우, cache hit이므로 실행시간은 +1을 해준다.

+) 여기서 이미 list 안에 있는 경우 list의 맨 뒤로 보내야하는데, 그 작업을 안해서 몇 개 테스트 케이스를 틀렸었다. 

 

4. 두번째는 list size가 cacheSize보다 없는 경우이다. 현재 list상에 존재하지도 않고 아직 cacheSize를 넘지 않았으니, 그냥 list에 추가해주면 된다. cache miss 이므로 실행시간에 +5를 해주면 된다.

5. 마지막으로는 이미 cacheSize만큼 list가 다 차버린 경우이다. 이런 경우에는 list의 첫번째값(제일 사용하지 않은)을 삭제하고, 새롭게 데이터를 추가해주면 된다. 마찬가지로 cache miss이므로 실행시간에 +5를 해주면 된다.