CodingTEST
[백준 2751] 수 정렬하기 2 (JAVA)
경걍
2023. 7. 29. 21:56
반응형
백준 2751번 문제 - 수 정렬하기 2
2751번: 수 정렬하기 2
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.
www.acmicpc.net
문제 분석
: 단순 오른차순으로 정렬하기
해결 키 포인트
- 오름차순 정렬
- Arrays.sort()
- 병합 정렬
병합 정렬 설명
복합 정복 방식을 사용해 데이터를 분할하고 분할한 집합을 정렬하여 합치는 알고리즘
- 최소 단위로 분할 (가장 작은 데이터 집합으로 분할)
- 두 단위를 병합하면서 정렬
코드
import java.io.*;
import java.util.Arrays;
public class Main {
public static int [] nums, temp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// N 입력
int N = Integer.parseInt(br.readLine());
// 수 입력
nums = new int [N];
temp = new int [N];
for(int i=0;i<N;i++) {
nums[i] = Integer.parseInt(br.readLine());
}
// Arrays.sort로 수 정렬하기
// Arrays.sort(nums);
// 합병 정렬로 정렬하기
mergeSort(0, N-1);
for(int i=0;i<N;i++) {
bw.write(nums[i] + "\n");
}
bw.flush();
bw.close();
}
public static void mergeSort(int s, int e) {
if(e - s < 1) {
return;
}
// 분할
int m = s + (e-s) / 2;
mergeSort(s, m);
mergeSort(m+1, e);
// s~e까지 temp 복사
for(int i=s;i<=e;i++) {
temp[i] = nums[i];
}
// 변수 초기화
int originalIndex = s;
int index1 = s;
int index2 = m+1;
// 병합
while(index1 <= m && index2 <= e) {
if(temp[index1] < temp[index2]) {
nums[originalIndex] = temp[index1];
index1++;
}
else {
nums[originalIndex] = temp[index2];
index2++;
}
originalIndex++;
}
while(index1 <= m) {
nums[originalIndex] = temp[index1];
index1++;
originalIndex++;
}
while(index2 <= e) {
nums[originalIndex] = temp[index2];
index2++;
originalIndex++;
}
}
}
반응형