문제
캐시메모리는 CPU와 주기억장치(DRAM) 사이의 고속의 임시 메모리로서 CPU가 처리할 작업 을 저장해 놓았다가 필요할 바로 사용해서 처리속도를 높이는 장치이다. 워낙 비싸고 용량이 작아 효율적으로 사용해야 한다. 철수의 컴퓨터는 캐시메모리 사용 규칙이 LRU 알고리즘을 따른다. LRU 알고리즘은 Least Recently Used 의 약자로 직역하자면 가장 최근에 사용되지 않 은 것 정도의 의미를 가지고 있습니다. 캐시에서 작업을 제거할 때 가장 오랫동안 사용하지 않은 것을 제거하겠다는 알고리즘입니다.
만약 캐시의 사이즈가 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가 되고, 63번 앞에 있는 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 이다.
💡 출력설명
마지막 작업 후 캐시메모리의 상태를 가장 최근 사용된 작업부터 차례로 출력합니다.
💡 입력예제
5 9
1 2 3 2 6 2 3 5 7
💡 출력예제
7 5 3 2 6
코드
최종 풀이
#include <stdio.h>
#include <vector>
using namespace std;
int main () {
int s, n, input, i, j, pos;
scanf("%d %d", &s, &n);
vector<int> c(s);
for(i = 0; i < n; i++) {
scanf("%d", &input);
pos = -1;
for(j = 0; j < n; j++) {
if(input == c[j]) { // hit인 해당 index를 pos에 할당한다.
pos = j;
}
}
if(pos == -1) { // miss
for(j = s - 1; j >= 1; j--) {
c[j] = c[j - 1];
}
} else { // hit
for(j = pos; j >= 1; j--) {
c[j] = c[j - 1];
}
}
c[0] = input;
}
for(i = 0; i < s; i++){
printf("%d ", c[i]);
}
return 0;
}
설명
사용자로부터 캐시의 크기 S와 작업의 개수 N을 입력받고 S크기의 배열 c를 선언한다.
N개의 작업번호를 입력받기 위해 N번 반복하는 for문을 작성하고 입력받은 작업번호를 input에 할당해나간다.
Hit와 Miss인 경우를 판단하기 위한 pos를 선언하고 -1로 초기화해놓는다.
Hit인 경우 사용자로부터 받은 input이 c배열(캐시메모리)에 있는지 확인해야하므로 n만큼 반복하는 for문을 작성하여 있을 경우 해당 index(j)를 pos에 할당한다.
pos가 -1일 경우 Miss에 해당하므로 s-1부터 1까지 삽입정렬을 시행한다. 이후 index의 0에는 작업번호가 들어와야 하므로 input을 할당한다.
그 외의 경우 Hit에 해당하므로 pos(캐시메모리에서 Hit 경우인 index)부터 1까지 삽입정렬을 시행한다. 이후 index의 0에는 작업번호가 들어와야 하므로 input을 할당한다.
배운 점
pos변수를 통해 Hit와 Miss의 case를 구별할 수 있다는 것을 알게되었다.
해당 내용은 김태원님의 'it 취업을 위한 알고리즘 문제풀이' 강의를 듣고 작성한 글입니다.
'🤯 코딩테스트 > C/C++' 카테고리의 다른 글
[it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비] 정렬 - 두 배열 합치기(병합정렬 예비학습) (0) | 2022.09.03 |
---|---|
[it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비] 정렬 - Inversion Sequence (0) | 2022.09.03 |
[it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비] 정렬 - 삽입정렬 (0) | 2022.09.01 |
[it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비] 정렬 - Special Sort (0) | 2022.08.31 |
[it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비] 정렬 - 버블정렬 (0) | 2022.08.31 |