[백준] 2751. 수 정렬하기 2 / 10989. 수 정렬하기 3

진예·2023년 10월 13일
0

Baekjoon : JAVA

목록 보기
28/76
post-thumbnail

📌 문제 : 2

[2751] 수 정렬하기 2

N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.

⬇️ 입력

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

⬆️ 출력

첫째 줄부터 N개의 줄오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.

💡 코드 : 2

Arrays.sort() 메서드는 dual-pivot-Quicksort를 수행하는데, 보통 퀵 정렬의 평균 시간복잡도O(nlogn)이지만 최악 시간복잡도O(n^2)이므로 해당 메서드를 사용하면 시간 초과가 뜨게 된다!

Collections.sort() 메서드는 TimeSort를 수행하는데, 해당 정렬의 평균 시간복잡도O(n), 최악 시간복잡도O(nlogn)이므로 제한시간 내에 문제 해결이 가능하다!

import java.io.*;
import java.util.*;
public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringBuilder sb = new StringBuilder();
		
		int n = Integer.parseInt(br.readLine());
		List<Integer> list = new ArrayList<>();
		for(int i=0;i<n;i++) {
			list.add(Integer.parseInt(br.readLine()));
		}
		
		Collections.sort(list);
		
		for(int i=0;i<n;i++) {
			sb.append(list.get(i)).append("\n");
		}
		bw.write(sb + "");
		
		br.close();
		bw.close();
	}
}	


📌 문제 : 3

[10989] 수 정렬하기 3

N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.

⬇️ 입력

첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.

⬆️ 출력

첫째 줄부터 N개의 줄오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.

✔️ 제한

  • 시간 제한 : 3초
  • 메모리 제한 : 512MB

💡 코드 : 3

✅ 이번 문제는 Arrays.sort()를 사용하니 풀리긴 풀렸다! 엄청 간당간당하게,,

import java.io.*;
import java.util.*;
public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringBuilder sb = new StringBuilder();
		
		int n = Integer.parseInt(br.readLine());
		int[] arr = new int[n];
		for(int i=0;i<n;i++) {
			arr[i] = Integer.parseInt(br.readLine());
		}
		
		Arrays.sort(arr);
		
		for(int i=0;i<n;i++) {
			sb.append(arr[i]).append("\n");
		}
		bw.write(sb + "");
		
		br.close();
		bw.close();
	}
}	

➕ 문제 설명에 적힌 걸 보니 카운팅 정렬을 사용하면 좀 더 널널하게 풀 수 있는 것 같아서 [ 구글링 1 & 구글링 2 ] 를 참고하여 풀어봤다.

import java.io.*;
import java.util.*;
public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringBuilder sb = new StringBuilder();
		
		int n = Integer.parseInt(br.readLine());
		int[] cnt = new int[10001];
		for(int i=0;i<n;i++) {
			cnt[Integer.parseInt(br.readLine())]++;
		}
		
		for(int i=1;i<=10000;i++) {
			while(cnt[i] > 0) {
				sb.append(i).append("\n");
				cnt[i]--;
			}
		}
		bw.write(sb + "");
		
		br.close();
		bw.flush();
		bw.close();
	}
}	

profile
백엔드 개발자👩🏻‍💻가 되고 싶다

0개의 댓글