문제
수 정렬하기1과 유사하지만 개수가 1,000,000개 이기 때문에 유의해야 할 것들이 있었습니다. 물론 선택,버블,삽입 과 같은 정렬로는 안되고 log의 시간 복잡도를 가지는 알고리즘으로 풀어야 하는데 퀵과 병합을 배웠기 때문에 사용해봤습니다.
하지만 정렬되어 있을 경우 퀵정렬은 최악의 시간 복잡도 N^2를 가지기 때문에 안나올 것입니다.
동빈나님은 어찌어찌 되었지만 저는 안되더라구요. 그래서 병합정렬로 해보았습니다.
풀이
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
//수 정렬하기 2
static int[] sorted;
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
Main sort = new Main();
int t = Integer.parseInt(bf.readLine());
int[] arr = new int[t];
sorted = new int[t];
for(int i=0;i<t;i++) {
arr[i] = Integer.parseInt(bf.readLine());
}
sort.mergeSort(arr,0,arr.length-1);
for(int i=0;i<arr.length;i++) {
bw.write(String.valueOf(arr[i])+"\n"); // 출력
}
bw.flush();
bw.close();
}
public void mergeSort(int[] arr,int x,int y) {
if(x<y) {
int mid = (x+y)/2;
mergeSort(arr, x, mid);
mergeSort(arr, mid+1, y);
merge(arr,x,mid,y);
}
}
public static void merge(int[] arr,int x,int mid,int y) {
int i = x;
int j = mid+1;
int k = x;
while(i<=mid && j<=y) {
if(arr[i] < arr[j]) {
sorted[k] = arr[i];
i++;
}else {
sorted[k] = arr[j];
j++;
}
k++;
}
if(i>mid) {
for(int t=j;t<=y;t++) {
sorted[k] = arr[t];
k++;
}
}else {
for(int t=i;t<=mid;t++) {
sorted[k] = arr[t];
k++;
}
}
for(int t=x;t<=y;t++) {
arr[t] = sorted[t];
}
}
}
이와 같이 풀었는데 처음엔 곧죽어도 시간 초과가 떠서 너무 짜증났는데.. 역시나 기본이 젤 중요한지 입출력을 더 생각해야 했었어요. 저는 입력만 bufferedreader로 받아서 했는데 출력도 bufferedWriter를 사용해야 시간초과가 안나오더라구요. ㅜㅜ 역시 공부 부족입니다. bufferedWriter는 익숙치가 않은데 공부해야겠습니다.
'코딩테스트 > 백준' 카테고리의 다른 글
[백준/1181] 단어정렬 - 자바 (0) | 2021.07.22 |
---|---|
[백준/1427] 소트인사이드 - 자바 (0) | 2021.07.19 |
[백준/10989] 수 정렬하기3 - 자바 (0) | 2021.07.16 |
[백준/2750] 수 정렬하기 - 자바 (0) | 2021.07.10 |
백준[11721] 열 개씩 끊어 출력하기-자바,파이썬 (0) | 2021.07.08 |