코딩테스트/기타
[정렬] 삽입 정렬 .java
머밍
2024. 11. 6. 14:55
설명
N개의 숫자가 입력되면 오름차순으로 정렬하여 출력하는 프로그램을 작성하세요.
정렬하는 방법은 삽입정렬입니다.
입력
첫 번째 줄에 자연수 N(1 <=N <=100)이 주어집니다.
두 번째 줄에 N개의 자연수가 공백을 사이에 두고 입력됩니다. 각 자연수는 정수형 범위 안에 있습니다.
출력
오름차순으로 정렬된 수열을 출력합니다.
예시 입력 1
6
11 7 5 6 10 9
예시 출력 1
5 6 7 9 10 11
내 풀이
1. 외부 for문: 열의 모든 요소를 차례대로 정렬
- cnt에 현재 정렬할 값을 저장, j는 정렬된 부분의 마지막 인덱스
2. 내부 while문 : 정렬된 부분에서 cnt보다 큰 값들을 오른쪽으로 이동
=> 이후 j를 감소시켜 이전 요소로 이동
3. while문 이후: nums[j + 1] = cnt;를 통해 cnt 값을 정렬된 부분의 적절한 위치에 삽입
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] nums = new int[n];
for(int i = 0; i < n; i++){
nums[i] = sc.nextInt();
}
//최솟값을 찾고 이를 현재 위치한 값과 바꾸기
for(int i = 0; i < n; i++){
int cnt = nums[i];//현재 정렬할 값
int j = i - 1;
//정렬된 부분에서 현재 값보다 큰 값들을 오른쪽으로 이동
while(j >= 0 && nums[j] > cnt) {
nums[j + 1] = nums[j];//큰 값을 오른쪽으로
j--;//이전 인덱스로 이동
}
nums[j + 1] = cnt;//현재 값(cnt)을 정렬된 위치에 삽입
}
for(int x : nums){
System.out.print(x + " ");
}
}
}
다른 풀이
- 외부 for문 - i : 1부터 n까지, tmp = arr [i];
- 내부 for문 - j : i-1부터 0 이상까지 j --
- -> arr [j] > tmp 면(크면 뒤로 밀기) -> arr [j+1] = arr [j];
- 이후 j--로 내부 for문이 멈춤 -> 멈춘 j 지점 뒤에다 tmp 넣기 arr [j+1] = tmp
항상 for문 j가 멈춘 그 j 바로 뒤 인덱스에 tmp삽입이 포인트
=> 내부 for문에서 사용한 j를 for문 이후에도 사용하기 위해 j를 내부 for문전에서 선언함
import java.util.Scanner;
public class Main {
public int[] solution(int n , int[] arr){
for(int i = 1 ; i < n; i++){
int tmp = arr[i];
int j;
for(j = i-1; j >=0 ; j--){
if(arr[j] > tmp){
arr[j+1] = arr[j];//오른쪽으로 밀기
} else break;
}
arr[j+1] = tmp;
}
return arr;
}
public static void main(String[] args) {
Main T = new Main();
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
for(int i = 0; i < n; i++){
arr[i] = sc.nextInt();
}
for(int x : T.solution(n, arr)){
System.out.print(x + " ");
}
}
}
💡💡
여러 정렬 중에 삽입 정렬이 이해하는데 제일 시간이 걸렸다... 미는 것과 미는 것이 끝난 후 j의 위치 바로 뒤가 현재 tmp의 자리이다!
삽입 정렬은 배열에서 각 요소를 선택하여 정렬된 부분에 적절한 위치에 삽입하는 방식으로 배열을 정렬하는 알고리즘이다