728x90
설명
풀이
자료구조는 int 배열을 사용하며 알고리즘은 정렬을 활용한다.
로직은 다음과 같다.
- 캐시 크기만큼의 int 배열을 생성한다.
- 작업이 들어있는 배열을 돈다.
- 초기 int형 변수 pos를 -1로 둔다. 이 변수는 현재 수가 캐시에 존재하는지 확인할 수 있는 변수이다.
- 캐시 배열을 돌면서 현재 수가 캐시 배열에 존재하는지 확인한다.
- 존재한다면 해당 인덱스 변호를 pos 변수에 저장한다.
- pos가 -1 이면 캐시에 현재 값이 존재하지 않는다는 뜻이다. 즉, miss 인 경우이다.
- 배열의 맨 뒤부터 1번 인덱스까지 1 감소시키며 반복문을 돈다.
- 오른쪽으로 수를 하나씩 민다. 캐시 배열의 i-1 번째 인덱스의 값을 캐시 배열의 i 번째 인덱스의 값에 넣는다.
- 배열의 맨 뒤부터 1번 인덱스까지 1 감소시키며 반복문을 돈다.
- pos가 -1이 아니면 캐시에 현재 값이 존재한다는 뜻이다. 즉, hit 인 경우이다.
- pos 부터 1번 인덱스까지 1 감소시키며 반복문을 돈다.
- 오른쪽으로 수를 하나씩 민다. 캐시 배열의 i-1 번째 인덱스의 값을 캐시 배열의 i 번째 인덱스의 값에 넣는다.
- pos 부터 1번 인덱스까지 1 감소시키며 반복문을 돈다.
- 캐시의 맨 0번째 값에 현재 값을 넣는다.
- 캐시 배열을 리턴한다.
코드
package inflearn._6_4;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
/**
* 삽입 정렬로 구현하기
*/
public class Main {
public static int [] solution(int s, int n, int [] arr) {
int [] cache = new int[s]; // 캐시
// 작업이 들어있는 배열 돌면서
for(int x : arr) {
int pos = -1;
// x 가 cache 에 존재하는지 확인
// 이 과정으로 pos가 정해짐 (pos로 miss(원소가 캐시에 존재하지 않음)인지 hit(원소가 캐시에 존재함)인지 알 수 있음)
for(int i = 0; i < s; i++) {
if (x == cache[i]) pos = i;
}
// miss (캐시에 현재 값이 존재하지 않음)
if (pos == -1) {
for(int i = s-1; i >= 1; i--) { // 맨 뒤부터
cache[i] = cache[i-1]; // 오른쪽으로 한 칸씩 당기기
}
}
// hit (캐시에 현재 값이 존재함)
else {
for(int i = pos; i >= 1; i--) { // hit된 그 인덱스부터
cache[i] = cache[i-1]; // 오른쪽으로 한 칸씩 당기기
}
}
cache[0] = x; // 캐시의 맨 첫번째에 현재 값 넣기
}
return cache;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int s = Integer.parseInt(st.nextToken()); // 캐시 사이즈
int n = Integer.parseInt(st.nextToken()); // 작업 개수
st = new StringTokenizer(br.readLine(), " ");
int [] arr = new int[n]; // 작업이 저장되어 있는 배열
for(int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
int [] cache = solution(s, n, arr);
for(int x : cache) {
sb.append(x).append(" ");
}
bw.write(sb.toString());
bw.flush();
bw.close();
br.close();
}
}
728x90
'Coding Test Inflearn' 카테고리의 다른 글
[정렬] 장난꾸리기 (0) | 2024.05.09 |
---|---|
[정렬] 중복 확인 (0) | 2024.05.09 |
[자료구조] 응급실 (0) | 2024.04.29 |
[자료구조] 교육과정설계 (0) | 2024.04.29 |
[자료구조] 공주구하기 (1) | 2024.04.25 |