LRU

2024. 8. 24. 01:43·algorithm
 
설명

캐시메모리는 CPU와 주기억장치(DRAM) 사이의 고속의 임시 메모리로서 CPU가 처리할 작업을 저장해 놓았다가

필요할 바로 사용해서 처리속도를 높이는 장치이다. 워낙 비싸고 용량이 작아 효율적으로 사용해야 한다.

철수의 컴퓨터는 캐시메모리 사용 규칙이 LRU 알고리즘을 따른다.

LRU 알고리즘은 Least Recently Used 의 약자로 직역하자면 가장 최근에 사용되지 않은 것 정도의 의미를 가지고 있습니다.

캐시에서 작업을 제거할 때 가장 오랫동안 사용하지 않은 것을 제거하겠다는 알고리즘입니다.

캐시의 크기가 주어지고, 캐시가 비어있는 상태에서 N개의 작업을 CPU가 차례로 처리한다면 N개의 작업을 처리한 후

캐시메모리의 상태를 가장 최근 사용된 작업부터 차례대로 출력하는 프로그램을 작성하세요.

 

입력

첫 번째 줄에 캐시의 크기인 S(3<=S<=10)와 작업의 개수 N(5<=N<=1,000)이 입력된다.

두 번째 줄에 N개의 작업번호가 처리순으로 주어진다. 작업번호는 1 ~100 이다.

 

출력

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

 

예시 입력 1 

5 9
1 2 3 2 6 2 3 5 7

 

예시 출력 1

7 5 3 2 6

 

소스코드 1

import java.util.*;

// Least Recently Used
public class Main {
    public static List<Integer> solution(int S, int N, int[] arr) {
        List<Integer> memory = new ArrayList<>();
        for (int i = 0; i < N; i++) {
            if (!memory.contains(arr[i])) { // Cache Miss
                if (memory.size() == S) {
                    memory.remove(0);
                    memory.add(arr[i]);
                }else{
                    memory.add(arr[i]);
                }
            } else { //Cache Hit
                memory.remove(memory.indexOf(arr[i]));
                memory.add(arr[i]);
            }
        }

        return memory;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int S = sc.nextInt();
        int N = sc.nextInt();
        int arr[] = new int[N];
        for (int i = 0; i < N; i++) {
            arr[i] = sc.nextInt();
        }

        for (int i = S - 1; i >= 0; i--) {
            System.out.print(solution(S, N, arr).get(i)+" ");
        }
    }
}

 

소스코드 2

import java.util.Scanner;

// Least Recently Used
public class Main {
    public static int[] solution(int S, int N, int[] arr) {
        int[] memory = new int[S];
        int idx = 0;
        for (int i = 0; i < N; i++) {
            boolean tf = false;
            int findIdx = 0;
            for (int j = 0; j < S; j++) { //메모리에 캐시가 이미 있는지 확인
                if (memory[j] == arr[i]) {
                    tf = true;
                    findIdx = j;
                }
            }
            if (tf) { //Cache Hit
                for (int k = findIdx; k < idx - 1; k++) {
                    memory[k] = memory[k + 1];
                }
                memory[idx - 1] = arr[i];
            } else { //Cache Miss
                if (idx < S) {
                    memory[idx++] = arr[i];
                } else {
                    for (int k = 0; k < S - 1; k++) {
                        memory[k] = memory[k + 1];
                    }
                    memory[S - 1] = arr[i];
                }
            }
        }
        return memory;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int S = sc.nextInt();
        int N = sc.nextInt();
        int arr[] = new int[N];
        for (int i = 0; i < N; i++) {
            arr[i] = sc.nextInt();
        }

        for (int i = S - 1; i >= 0; i--) {
            System.out.print(solution(S, N, arr)[i] + " ");
        }
    }
}

 

소스코드 3

import java.util.Scanner;

// Least Recently Used 다른 풀이
public class Main {
    public static int[] solution(int S, int N, int[] arr) {
        int[] memory = new int[S];
        for (int val : arr) {
            int idx = -1;
            for (int i = 0; i < S; i++) {
                if (val == memory[i]) {
                    idx = i;
                }
            }

            if (idx == -1) {
                for (int i = S - 1; i > 0; i--) {
                    memory[i] = memory[i - 1];
                }
            } else {
                for (int i = idx; i > 0; i--) {
                    memory[i] = memory[i - 1];
                }
            }
            memory[0] = val;
        }
        return memory;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int S = sc.nextInt();
        int N = sc.nextInt();
        int arr[] = new int[N];
        for (int i = 0; i < N; i++) {
            arr[i] = sc.nextInt();
        }

        for (int i : solution(S, N, arr)) {
            System.out.print(i+" ");
        }
    }
}

'algorithm' 카테고리의 다른 글

장난꾸러기  (0) 2024.08.24
중복 확인  (0) 2024.08.24
버블 정렬  (0) 2024.08.22
선택 정렬  (0) 2024.08.22
씨름 선수  (0) 2024.06.06
'algorithm' 카테고리의 다른 글
  • 장난꾸러기
  • 중복 확인
  • 버블 정렬
  • 선택 정렬
juuuuuuun
juuuuuuun
  • juuuuuuun
    namae
    juuuuuuun
  • 전체
    오늘
    어제
    • 분류 전체보기 (94)
      • java (2)
      • Infra (4)
      • server (2)
      • algorithm (52)
      • HTTP (8)
      • android (1)
      • baekjoon (16)
      • 소프트웨어공학 (6)
      • 기타 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
juuuuuuun
LRU
상단으로

티스토리툴바