[ 삽입 정렬 ] 알고리즘

2023. 3. 18. 17:34개발/👾 PS

 

 

1.  개념

     

      삽입 정렬 : 이미 정렬된 범위에 정렬되지 않은 데이터를 알맞은 위치에 끼어넣는 정렬

     

      * 시간 복잡도 : O(n²)

           

     삽입 정렬 방법

 

      1) 두번째 인덱스에서 출발한다

 

      2) 현재 선택한 데이터 앞부분은 이미 정렬된 범위이며 정렬된 범위 내에 선택한 데이터를 알맞은 위치에 넣는다

 

      3) 반복  

 

                 

          삽입 정렬이 버블 정렬, 선택 정렬과 다른 점

 

          - 버블 정렬, 선택 정렬 : 첫 번째 인덱스부터 시작 / 삽입 정렬 : 두 번째 인덱스부터 시작

 

          - 버블 정렬, 선택 정렬 : 정렬된 범위 방치 / 삽입 정렬 : 정렬된 범위 계속 이용

 

 

 

 

2.  문제 풀이

 

 

# 1  ATM 인출 시간 계산하기 - 백준 11399번

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

 

11399번: ATM

첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)

www.acmicpc.net

 

 

# 최소 시간 합을 구하기 위해서는 인출 시간이 가장 긴 사람을 뒤에 배치해야 하므로 인출 시간을 오름차순으로 정렬해야 한다.

import sys 
input = sys.stdin.readline 

# 입력 받기
n = int(input())
num = [0]
num.extend(list(map(int,input().split())))
sumList = [0]

# 삽입 정렬
for i in range(2,n+1):
    key = num[i]   # 데이터 선택 - 2번째 데이터부터 출발
    for j in range(1,i):  # 1~i : 정렬된 범위 - 선택한 데이터 알맞은 위치에 삽입
        if key < num[j]:
            num[i],num[j] = num[j],num[i]

# 구간 합 구하기

for i in range(1,n+1):
    sumList.append(num[i]+sumList[i-1])

# 답 : 구간 합의 총합
print(sum(sumList))

'개발 > 👾 PS' 카테고리의 다른 글

[ 병합 정렬 ] 알고리즘  (1) 2023.03.19
[ 퀵 정렬 ] 알고리즘  (0) 2023.03.18
[ 선택 정렬 ] 알고리즘  (0) 2023.03.18
[ 버블 정렬 ] 알고리즘  (0) 2023.03.17
[슬라이딩 윈도우] 알고리즘  (2) 2023.03.15