Notice
Recent Posts
Recent Comments
Link
개발자는 기록이 답이다
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비(Sorting and Searching(정렬, 이분검색과 결정알고리즘)_Least Recently Used) 본문
알고리즘/인프런 - Java알고리즘 입문
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비(Sorting and Searching(정렬, 이분검색과 결정알고리즘)_Least Recently Used)
slow-walker 2023. 10. 2. 00:24
4. Least Recently Used
예시 입력 1
5 9
1 2 3 2 6 2 3 5 7
예시 출력 1
7 5 3 2 6
각 문제 풀이에 대한 설명은 주석으로 달아놓음.
list로 풀수도 있지만, 왠만하면 정렬로 푸는 연습을 해라. 왜냐하면 코드 구현력이 어느정도인지 확인하기 위함이다.
문제에 대한 이해도가 중요했음,,
내가 푼 풀이 1 (ArrayList) - Time: 164ms Memory: 27MB
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class ListExample {
public int[] solution(int size, int n, int[] arr) {
int[] answer = new int[size];
ArrayList<Integer> list = new ArrayList<>();
for (int x : arr) {
if (list.contains(x)) {
// remove(int idx) 함수라서 indexOf()필요
list.remove(list.indexOf(x));
list.add(x);
} else list.add(x);
}
int idx = 0;
for (int i = list.size()-1; i >= 0; i--) {
// 뒤에서부터 반복문 돌면서 -n개 만큼일 경우 break
// 왜냐하면 n개 만큼 answer[] 집어넣어서 더 이상 필요 없음
if (i == list.size()-1-size ) break;
answer[idx++] = list.get(i);
}
return answer;
}
public static void main(String[] args) {
ListExample T = new ListExample();
Scanner kb = new Scanner(System.in);
int k = kb.nextInt();
int n = kb.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = kb.nextInt();
}
for (int x : T.solution(k, n, arr)) {
System.out.print(x + " ");
}
}
}
내가 푼 풀이 2 (Stack) - Time: 190ms Memory: 27MB
import java.util.Scanner;
import java.util.Stack;
public class StackExample {
public int[] solution(int size, int n, int[] arr) {
int[] answer = new int[size];
Stack<Integer> stack = new Stack<>();
for (int x : arr) {
if (stack.contains(x)) {
// remove(int idx) 함수라서 indexOf()필요
stack.remove(stack.indexOf(x));
stack.push(x);
} else stack.push(x);
}
for (int i = 0; i < n ; i++) {
// i가 size만큼일 경우 브레이크
// size가 3일 경우 왜냐하면 0 1 2 번째 인덱스는 answer에 넣고 3번째 인덱스일때 멈추기 위함
if (i == size) break;
answer[i] = stack.pop();
}
return answer;
}
public static void main(String[] args) {
StackExample T = new StackExample();
Scanner kb = new Scanner(System.in);
int k = kb.nextInt();
int n = kb.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = kb.nextInt();
}
for (int x : T.solution(k, n, arr)) {
System.out.print(x + " ");
}
}
}
강의 풀이 (정렬) - Time: 161ms Memory: 27MB
LRU 알고리즘은 가장 오래 전에 사용되지 않은 데이터를 우선적으로 교체하는 방식으로 동작하는 캐시 교체 알고리즘입니다.
import java.util.Scanner;
public class Main {
public int[] solution(int size, int n, int[] arr) {
int[] cache = new int[size];
for (int x : arr) {
// x값이 캐시 배열에 있는지 없는지 살피기 위해 pos인덱스 변화 초기화
int pos = -1;
// 이미 캐시에 있다면 pos에 i 인덱스 재할당
for (int i = 0; i < size; i++) {
if (x == cache[i]) pos = i;
}
// 캐시 미스 상황( 값이 캐시배열에 없을때 )
if (pos == -1) {
// 뒤에서 부터 1까지 i가 순회한다
for (int i = size - 1; i >= 1; i--) {
// 뒤쪽 부터 오니까 i지점에 i-1을 땡겨준다
cache[i] = cache[i - 1];
}
// 현재 들어올 작업은 최우선이라 0번에 넣기
cache[0] = x;
// 캐시 히트 상황 ( 값이 캐시배열에 없을때 )
} else {
// 히트난 지점부터 1까지만 돈다! (0는 히트값 넣어야 하므로)
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 kb = new Scanner(System.in);
int k = kb.nextInt();
int n = kb.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = kb.nextInt();
}
for (int x : T.solution(k, n, arr)) {
System.out.print(x + " ");
}
}
}