백준_2751 수 정렬하기2 (풀이 참고 코드개선)Algorithm/Algorithm 문제2024. 1. 17. 12:25
Table of Contents
기존 코드는 분할 할때마다 새로운 int 배열 두개를 생성해서 정렬하고,
그걸 merge한 배열을 또 새로 만들어서 반환하는 형식
에서 다른 코드 참고하고 이해해서 개선했다
해당 코드는 정렬을 위한 temp 배열 외에는 다른 배열을 만들지 않고
정렬한 값을 다시 본 입력받은 배열에 저장하는 방식
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BJ_2751 {
static int[] arr, tempArr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
arr = new int[n];
tempArr = new int[n];
for(int i=0; i<n; i++) {
arr[i] = Integer.parseInt(br.readLine());
}
mergeSort(0, n-1);
for(int i=0; i<n; i++) {
sb.append(arr[i]).append('\n');
}
System.out.println(sb);
}
static void mergeSort(int s, int e) {
if(e-s < 1) {
return;
}
int m = (e+s)/2;
mergeSort(s,m);
mergeSort(m+1,e);
int i, j;
for(i=s; i<e+1; i++) {
tempArr[i] = arr[i];
}
int arrInd = s;
i = s;
j = m+1;
while(i<m+1 && j<e+1) {
if(tempArr[i] > tempArr[j]) {
arr[arrInd++] = tempArr[j++];
} else if (tempArr[i] < tempArr[j]) {
arr[arrInd++] = tempArr[i++];
}
}
while(i<m+1) {
arr[arrInd++] = tempArr[i++];
}
while(j<e+1) {
arr[arrInd++] = tempArr[j++];
}
}
}
맨 위 제출이 개선한 코드이다.
속도 뿐만 아니라 메모리도 반 이상 줄었다
'Algorithm > Algorithm 문제' 카테고리의 다른 글
백준_10989 수 정렬하기 3 (기수 정렬) - 실패(메모리초과) (0) | 2024.01.18 |
---|---|
백준_1517 버블 소트 (병합정렬) (0) | 2024.01.17 |
백준_2751 수 정렬하기2 (병합정렬) (0) | 2024.01.16 |
백준_11004 k번째 수 (퀵정렬) (0) | 2024.01.15 |
백준_11399 ATM (삽입정렬 & 구간합배열) (0) | 2024.01.14 |
@kjyyjk :: 녕의 학습 기록
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!