알고리즘/Do it! 알고리즘 코딩 테스트

삽입 정렬 (Insertion sort)

모닝펄슨 2024. 5. 16. 10:07

삽입 정렬 (Insertion Sort)

삽입 정렬은 이미 정렬된 데이터 범위에 정렬되지 않은 데이터를 적절한 위치에 삽입시켜 정렬하는 방식이다. 평균 시간 복잡도는 O(n^2)으로 느린 편이지만 구현하기가 쉽다.

 

https://www.geeksforgeeks.org/insertion-sort/

 

삽입 정렬 과정
1. 현재 index에 있는 데이터 값을 선택한다.
2. 현재 선택한 데이터가 정렬된 데이터 범위에 삽입될 위치를 탐색한다.
3. 삽입 위치부터 index에 있는 위치까지 shift 연산을 수행한다.
4. 삽입 위치에 현재 선택한 데이터를 삽입하고 index++ 연산을 수행한다.
5. 전체 데이터 크기만큼 index가 커질 때까지, 즉 선택할 데이터가 없을 때까지 반복한다.

 

적절한 삽입 위치를 탐색하는 부분에서 이진 탐색(binary search) 등과 같은 탐색 알고리즘을 사용하면 시간 복잡도를 줄일 수 있다.

 

크기가 작거나 거의 정렬된 리스트의 경우, 또는 간단함과 안전성이 중요한 경우 사용이 된다.

 


 

[백준 11399번] ATM

https://www.acmicpc.net/problem/11399

 

ATM 앞에 있는 사람 중 인출 시간이 가장 적게 걸리는 사람이 먼저 인출할 수 있도록 순서를 정하는 것이 곧 그리디 방식이다. 그리고 이를 위해서는 인출 시간을 기준으로 값을 정렬해야 한다. N의 최댓값이 1,000이고 시간 제한이 1초이므로 시간 복잡도가 O(n^2) 이하인 정렬 알고리즘 중 아무거나 사용해도 된다. 여기서는 삽입 정렬을 사용한다. 정렬을 마친 후에는 각 사람이 돈을 인출하는데 필요한 시간을 합 배열을 이용해 더하면 된다.

 

 

[정답]

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int[] A = new int[N];
        int[] S = new int[N];
        String[] str = br.readLine().split(" ");
        for (int i = 0; i < N; i++) {
            A[i] = Integer.parseInt(str[i]);
        }

        for (int i = 1; i < N; i++) {	// 삽입 정렬
            int insert_point = i;
            int insert_value = A[i];
            for (int j = i - 1; j >= 0; j--) {
                if(A[j] < A[i]) {
                    insert_point = j + 1;
                    break;
                }
                if(j == 0) {
                    insert_point = 0;
                }
            }
            for (int j = i; j > insert_point; j--) {
                A[j] = A[j-1];
            }
            A[insert_point] = insert_value;
        }
        S[0] = A[0];        // 합배열 만들기
        for (int i = 1; i < N; i++) {
            S[i] = S[i-1] + A[i];
        }
        int sum = 0;        // 합배열 총합 구하기
        for (int i = 0; i < N; i++) {
            sum += S[i];
        }
        System.out.println(sum);
    }
}

 

 

 

 

 

 

[참고자료]

- Do it! 알고리즘 코딩 테스트 자바편