코테/프로그래머스

[프로그래머스/Lv. 2] [1차] 캐시 (JAVA)

imname1am 2023. 10. 25. 23:17
반응형

🔺 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

🔺 코드

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
33
34
35
36
import java.util.*;
 
class Solution {    
    public int solution(int cacheSize, String[] cities) {
 
        int answer = 0;
        LinkedList<String> cache = new LinkedList<>();
        
        // 캐시 사이즈가 0인 경우 특수처리
        if(cacheSize == 0)
            return 5 * cities.length;
        
        
        for(int i = 0 ; i < cities.length ; i++) {
            String city = cities[i].toLowerCase();
            
            // [cache hit]
            if(cache.remove(city)) {    // 기존 페이지 지우고,
                cache.addFirst(city);   // 이미 캐시에 있던 페이지 맨 앞으로 가져옴.
                answer += 1;
            }
            else {  // [cache miss]
               int nowSize = cache.size();
                
                if(nowSize == cacheSize) {  // 캐시가 가득찬 경우, 맨 뒤 페이지 삭제
                    cache.pollLast();   // = remove(0)
                }
                
                cache.addFirst(city);   // 맨 앞에 새 페이지 삽입
                answer += 5;
            }
        }
        
        return answer;
    }
}
cs

 

 

🧩  해결 아이디어

• 단순구현 & *LRU

(* LRU : 가장 오랫동안 참조하지 않은 페이지를 캐시에서 교체)

 

- 캐시 사이즈가 0인 경우, 모든 경우에 캐시 미스가 발생하므로 특수처리한다. (5 * 캐시사이즈)

- 0이 아닌 경우, cache hit과 cache miss로 나눠 생각한다.

    ㄴ cache hit인     경우)  이미 캐시 리스트에 기존 페이지가 존재한다면 기존 페이지를 지우고, 이미 캐시에 있던 페이지를 맨 앞에 추가한다. & 정답 + 1

    ㄴ cache miss인 경우) 캐시 리스트가 가득찬 경우, 맨 뒤 페이지를 삭제하고, 맨 앞에 새 페이지를 삽입한다. & 정답 + 5

 

 

 


🔺 다른 풀이들

- 복습은 이걸로 해야겠다... 과정은 같고 그냥 리스트를 활용하셨다.

& cache hit인지 확인하기 위해 cache.contains()를 사용하셨다.

 

프로그래머스 [1차] 캐시 JAVA

1. 문제 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

moon1226.tistory.com

import java.util.ArrayList;

class Solution {
    public static int solution(int cacheSize, String[] cities) {
        int answer = 0;
        ArrayList<String> list = new ArrayList<String>();

        if (cacheSize == 0)
            return cities.length * 5;

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

            if (list.contains(cities[i])) {
                answer++;
                list.remove(cities[i]);
                list.add(cities[i]);
            } else {
                answer += 5;
                if (list.size() == cacheSize) {
                    list.remove(0);
                    list.add(cities[i]);
                }
                else 
                    list.add(cities[i]);
            }
        }
        return answer;
    }
}

💬 느낀 점

흐 담엔 더 잘 풀장,,

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

✔ 정답 참고

 

 

[프로그래머스] 캐시 (Java)

프로그래머스 캐시구현은 어렵지 않은 문제였으나 LRU(Least Recently Used)에 대해서 알고있어야지만 풀 수 있는 문제였다. LFU와 헷갈려서 문제푸는데 시간이 조금 더 걸렸다.LRU(Least Recently Used) 가장

velog.io

 

 

LRU 알고리즘

 

페이지 교체 알고리즘, LRU 캐시 교체 알고리즘이란? 캐시란?, Cache hit, Cache Miss

페이지 교체 알고리즘 LRU Least Recently Used 1. 개념 가장 최근에 사용되지 않은 것 페이지에서 ...

blog.naver.com

 

반응형