본문 바로가기
알고리즘 이전/정렬, 이분검색, 결정알고리즘

LRU

by hoshi03 2023. 8. 13.

만약 캐시의 사이즈가 5이고 작업이 [2, 3, 1, 6, 7] 순으로 저장되어 있다면, (맨 앞이 가장 최근에 쓰인 작업이고, 맨 뒤는 가장 오랫동안 쓰이지 않은 작업이다.)

1) Cache Miss : 해야 할 작업이 캐시에 없는 상태로 위 상태에서 만약 새로운 작업인 5번 작업을 CPU가 사용한다면 Cache miss가 되고 모든 작업이 뒤로 밀리고 5번 작업은 캐시의 맨 앞에 위치한다. [5, 2, 3, 1, 6] (7번 작업은 캐시에서 삭제된다.)

2) Cache Hit : 해야 할 작업이 캐시에 있는 상태로 위 상태에서 만약 3번 작업을 CPU가 사용한다면 Cache Hit가 되고, 3번 앞에 있는 5, 2번 작업은 한 칸 뒤로 밀리고, 3번이 맨 앞으로 위치하게 된다.
[5, 2, 3, 1, 6] ---> [3, 5, 2, 1, 6]

캐시의 크기가 주어지고, 캐시가 비어있는 상태에서 N개의 작업을 CPU가 차례로 처리한다면 N개의 작업을 처리한 후 캐시 메모리의 상태를 가장 최근 사용된 작업부터 차례대로 출력하는 프로그램을 작성하세요.

※ 입력 설명
첫 번째 줄에 캐시의 크기인 S(3 <=S <=10)와 작업의 개수 N(5<=N<=1,000)이 입력된다.
두 번째 줄에 N개의 작업 번호가 처리 순으로 주어진다. 작업 번호는 1 ~100이다.

 출력 설명
마지막 작업 후 캐시 메모리의 상태를 가장 최근 사용된 작업부터 차례로 출력합니다.

 

삽입정렬을과 배열을 이용해서 푸는 문제

 

먼저 캐시 배열을 돌면서 캐시 안에 작업이 있는지 확인하고 

있으면 히트한 곳의 인덱스를 기억, 그 인덱스부터 1번까지 삽입정렬을

없으면 맨 뒤부터 1번까지 삽입정렬을 하고 

둘다 0번 인덱스에 새 작업을 넣어준다

 

import java.util.*;
import java.io.*;

class Main {

    public int[] solution(int size, int n, int[] arr){
        int[]cache = new int[size];
        for(int x : arr){
            int pos = -1;
            for(int i = 0; i < size; i++){
                //캐시 안에 작업이 있는 상태면 인덱스를 기억
                if(x == cache[i]) pos = i;
            }

            //미스, 뒤로 다 당기고 맨 앞에 x값 넣어주기
            if(pos == -1){
                for(int i = size-1; i >= 1; i--) {
                    cache[i] = cache[i-1];
                }
                cache[0] = x;
            }

            //hit, pos지점부터 반복문을 돌아서 캐시 값을 당겨주고 맨 앞에 pos위치의 값 넣어주기
            else {
                for(int i = pos; i >= 1; i--){
                    cache[i] = cache[i-1];
                }
                cache[0] = x;
            }
        }
        return cache;
    }



    public static void main(String[] args) {
            Main t = new Main();
            Scanner in = new Scanner(System.in);
            int s = in.nextInt();
            int n = in.nextInt();
            int[] arr = new int[n];
            for (int i =0; i <n; i++) arr[i]= in.nextInt();
            for(int x : t.solution(s,n,arr)) System.out.print(x + " ");

    }
}

 

 

'알고리즘 이전 > 정렬, 이분검색, 결정알고리즘' 카테고리의 다른 글

장난꾸러기  (0) 2023.08.13
중복탐색  (0) 2023.08.13
삽입정렬  (0) 2023.08.13
버블정렬  (0) 2023.08.12
선택정렬  (0) 2023.08.12