티스토리 뷰
문제는 위와 같으면 주어지는 수의 개수가 1,000,000 개까지 이므로 파이썬이 일반적으로 1초에 20,000,000 번의 연산을 수행한다고 할 때 NlogN 의 시간 복잡도를 가지는 정렬 알고리즘을 통해 문제를 해결할 수 있습니다.
NlogN 의 시간 복잡도를 가지는 정렬 알고리즘은 병합 정렬, 퀵 정렬, 힙 정렬 등이 있으며 기본적으로 파이썬에 내장된 sort() 메소드 또한 NlogN 의 시간 복잡도를 가진다고 할 수 있습니다.
먼저, 파이썬에 내장된 함수를 사용하는 코드를 살펴보겠습니다.
from sys import stdin
n = int(stdin.readline())
nums = [int(stdin.readline()) for _ in range(n)]
nums.sort()
print("\n".join(str(n) for n in nums))
다음으로 직접 병합 정렬을 구현하여 문제를 해결해보겠습니다.
from sys import stdin
# 병합 정렬 사용하기
def merge_sort(array):
if len(array) <= 1:
return array
mid = len(array) // 2
left = merge_sort(array[:mid])
right = merge_sort(array[mid:])
i, j, k = 0, 0, 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
array[k] = left[i]
i += 1
else:
array[k] = right[j]
j += 1
k += 1
if i == len(left):
while j < len(right):
array[k] = right[j]
k += 1
j += 1
elif j == len(right):
while i < len(left):
array[k] = left[i]
k += 1
i += 1
return array
n = int(stdin.readline())
nums = [int(stdin.readline()) for _ in range(n)]
nums = merge_sort(nums)
print("\n".join(str(n) for n in nums))
다음으로 자바 코드도 살펴보겠습니다. 먼저 자바에서도 기본적으로 제공하는 sort 메소드를 사용하여 구현하겠습니다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
int[] nums = new int[n];
for (int i = 0; i < n; i++) {
nums[i] = Integer.parseInt(br.readLine());
}
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++) {
sb.append(nums[i]).append("\n");
}
System.out.println(sb);
}
}
직접 병합 정렬을 구현한 자바 코드를 살펴보겠습니다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
int[] nums = new int[n];
for (int i = 0; i < n; i++) {
nums[i] = Integer.parseInt(br.readLine());
}
nums = mergeSort(nums);
for (int i = 0; i < nums.length; i++) {
sb.append(nums[i]).append("\n");
}
System.out.println(sb);
}
private static int[] mergeSort(int[] array) {
if (array.length <= 1) {
return array;
}
int mid = array.length / 2;
int[] left = new int[mid];
System.arraycopy(array, 0, left, 0, mid);
left = mergeSort(left);
int[] right = new int[array.length - mid];
System.arraycopy(array, mid, right, 0, right.length);
right = mergeSort(right);
int i = 0;
int j = 0;
int k = 0;
while (i < left.length && j < right.length) {
if (left[i] < right[j]) {
array[k] = left[i];
i += 1;
} else {
array[k] = right[j];
j += 1;
}
k += 1;
}
if (i == left.length) {
while (j < right.length) {
array[k] = right[j];
j += 1;
k += 1;
}
} else if (j == right.length) {
while (i < left.length) {
array[k] = left[i];
i += 1;
k += 1;
}
}
return array;
}
}
'알고리즘' 카테고리의 다른 글
[알고리즘 / 프로그래머스] 124 나라의 숫자 (0) | 2020.11.12 |
---|---|
[알고리즘 / 백준] 11004 - K번째 수 (0) | 2020.11.12 |
[알고리즘 / 백준] 7490 - 0 만들기 (0) | 2020.11.11 |
[알고리즘 / 백준] 2747 - 피보나치 수 (0) | 2020.11.11 |
[알고리즘 / 백준] 10989 - 수 정렬하기 3 (0) | 2020.11.10 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Baekjoon
- Combination
- CodeDeploy
- 조합
- 수학
- SWIFT
- sort
- spring
- 에라토스테네스의 체
- 소수
- permutation
- Algorithm
- 순열
- CodePipeline
- CodeCommit
- 프로그래머스
- array
- java
- ionic
- Dynamic Programming
- search
- ECR
- cloudfront
- DFS
- programmers
- BFS
- map
- EC2
- string
- AWS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함