-
[백준] 2750: 수 정렬하기 (삽입 정렬 ver)development/알고리즘 2024. 4. 24. 20:56
안녕하세요.
이번 문제는 백준의 2750번 '수 정렬하기' 입니다.
버블 정렬로도 풀어보고, 병합 정렬로도 풀어보고, 선택 정렬로도 풀어보고.. 이 문제는 여러 방식으로 풀어봤습니다.
이번엔 삽입 정렬에 대해서만 작성합니다.
문제
알고리즘 캔버스
코드
n = int(input()) result = [int(input()) for i in range(n)] for i in range(1, n): value = result[i] j = i while j > 0 and result[j-1] > value: result[j] = result[j-1] j -= 1 result[j] = value print(*result, sep="\n")
제약
- N(1 ≤ N ≤ 1,000)
- 둘째 줄부터 N개의 줄에는 수
- 절댓값이 1,000보다 작거나 같은 정수
- 수는 중복되지 않음
- 출력은 오름차순으로
- 한 줄에 하나씩 출력
아이디어
- 삽입 정렬로 구현한다.
- 삽입 정렬의 핵심은 탐색 대상의 이전 배열 요소는 모두 정렬 된 것으로 간주한다는 것.
아이디어 상세
- n을 입력받고, 배열을 리스트 컴프리헨션으로 result 변수에 입력 받는다.
- 먼저 range(1, n)(1번째 인덱스를 시작) 순회를 시작한다.
- 왜냐면 0번째 데이터는 이미 그 자체로 정렬된 데이터로 본다.
- 현재 탐색 대상의 원본 데이터를 따로 value 변수에 복사해둔다. (원본 자리의 데이터는 나보다 큰 값이 있다면 옮겨져야 함)
- 이미 정렬된 데이터(앞)를 순회하며 대상 값이 들어갈 자리를 찾아야 한다.
- While 문을 시작한다.
- 조건은 j가 0보다 커야 하고, (최소 인덱스 1까지만 탐색)
- result[j-1] 데이터가 대상 값보다 클 때까지 탐색을 진행한다.
- value보다 큰 값을 오른쪽으로 한칸씩 밀어준다.
- result[j] 위치가 현재 탐색 대상이 존재할 위치이므로 대상을 위치시킨다.
- 만약 제자리에 다시 옮겨지는 게 아니라면, 대상을 위치시키기 전엔 result[j]와 result[j+1]은 같은 값이 들어있게 된다 (중복값).
- While 문을 시작한다.
- result를 print 한다.
시간 복잡도 (Big-O)
- O(N^2)
테스트 케이스
[입력] 5 5 2 3 4 1 [출력] 1 2 3 4 5
감사합니다.
'development > 알고리즘' 카테고리의 다른 글
[백준] 2002: 추월 (0) 2024.04.12 [프로그래머스] 60057: 2020 KAKAO BLIND RECRUITMENT > 문자열 압축 (0) 2024.04.05 [프로그래머스] 120812: 최빈값 (1) 2024.03.29 [백준] 11047: 동전 0 (그리디) (0) 2024.03.22 [프로그래머스] JadenCase 문자열 만들기 (0) 2022.09.11