Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 애플 디벨로퍼 아카데미 21주차 회고
- 애플 디벨로퍼 아카데미 후기
- apple developer academy 후기
- Swift 디자인패턴
- 애플 디벨로퍼 아카데미
- global soop
- ObservableObject
- 네이버 치지직
- Swift 문법
- react
- OS
- sqoop
- 데이터베이스
- 앱 비교 프로젝트
- ObservedObject
- 소프트웨어분석및설계
- 제앱소
- Swift 기능
- 네이버 부스트캠프
- 운영체제
- Apple Developer Academy @ POSTECH
- StateObject
- iOS 개발 오류
- 애플 아카데미 후기
- SWIFT
- 치지직
- 숭실대
- 데이터베이스 공부
- useReducer
- swift문법
Archives
- Today
- Total
사과하는 제라스
[백준 BOJ 2751번] 수 정렬하기 2 본문
목차
728x90
반응형
출처 : https://www.acmicpc.net/problem/2751
1. 문제
N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.
2. 입력
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.
5
5
4
3
2
1
3. 출력
첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.
1
2
3
4
5
4. 풀이
우선, 해당 문제를 다양한 정렬 방식을 이용할 수 있는데 만약 Arrays.sort와 같은 라이브러리 함수를 사용할 시에는 시간 초과 에러가 뜨게 해두었다. Arrays.sort 함수는 dual pivot QuickSort 알고리즘을 사용하는데 평균 시간복잡도는 O(nlogn)이지만 퀵소트 특성 상 최악의 경우엔 시간복잡도가 O(N^2)이다. 그렇기에 다른 방법으로 합병정렬이나 힙정렬, 카운팅정렬 등을 사용할 수 있다. 풀이법은 일반적인 정렬이니 생략한다.
5. 소스코드
<합병 정렬>
import java.io.*;
class Main{
static int [] temp;
public static void main(String [] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int num = Integer.parseInt(br.readLine());
int [] arr = new int[num];
temp = new int[num];
for(int i=0; i<num; i++) arr[i] = Integer.parseInt(br.readLine());
mergeSort(arr, 0, num-1);
for(int i=0; i<num; i++) {
sb.append(arr[i]);
sb.append('\n');
}
System.out.println(sb);
}
public static void mergeSort(int[] A, int p, int r){
int q = (p+r)/2;
if(p<r){
mergeSort(A, p, q);
mergeSort(A, q+1, r);
merge(A, p, q, r);
}
}
public static void merge(int[] A, int p, int q, int r){
int i = p;
int j = q+1;
int k = p;
while(i <= q && j <= r){
if(A[i] < A[j]) temp[k++] = A[i++];
else temp[k++] = A[j++];
}
while(i <= q) temp[k++] = A[i++];
while(j <= r) temp[k++] = A[j++];
for(int a=p; a<=r; a++) A[a] = temp[a];
}
}
6. 배운 것
아직 힙정렬, 카운팅 정렬 풀이법 올리지 못함
728x90
반응형
'JAVA 백준 알고리즘 문제풀이 > 정렬' 카테고리의 다른 글
[백준 BOJ 10989번] 수 정렬하기 3 (0) | 2021.11.29 |
---|---|
[백준 BOJ 2750번] 수 정렬하기 (0) | 2021.11.23 |