본문 바로가기
Algorithm

백준 2751번: 수 정렬하기2(JAVA)

by bjgu97 2021. 11. 10.
반응형

https://www.acmicpc.net/problem/2751

 

2751번: 수 정렬하기 2

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

www.acmicpc.net

 

[풀이]

(1) 처음에는 단순히 Arrays.sort()를 사용해 정렬을 하려고 했다. 그러나 Arrays.sort()는 퀵소트.. 평균 nlogn의 시간복잡도를 가지지만 최악의 경우 n^2 가 된다. N의 크기가 최대 1000000(백만)이므로 당연히 시간초과.

(2) 그래서 이 문제에서 시간복잡도 n의 카운팅정렬을 사용했다.

 

[코드]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class BJ_2751_수정렬하기2 {
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		int N = Integer.parseInt(br.readLine());

		boolean[] temp = new boolean[2000001];
		
		for(int n = 0; n < N; n++) {
			int num = Integer.parseInt(br.readLine());
			temp[num + 1000000] = true;
		}
		
		for(int n = 0; n < 2000001; n++) {
			if(temp[n]) {
				sb.append(n - 1000000).append("\n");
			}
		}
		System.out.println(sb);
	}
}

 

(참고) 틀린코드#1 - 시간초과

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class BJ_2751_수정렬하기2 {
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		int N = Integer.parseInt(br.readLine());
		
		int[] arr = new int[N];
		for(int n = 0; n < N; n++) {
			arr[n] = Integer.parseInt(br.readLine());
		}
		
		Arrays.sort(arr);
		
		for(int n = 0; n < N; n++) {
			System.out.println(arr[n]);
		}
	}
}

 

(참고) 틀린코드#2 - 역시나 시간초과.

Stringbuilder을 써줘야 시간초과가 안난다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class BJ_2751_수정렬하기2 {
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
		int N = Integer.parseInt(br.readLine());
		
		boolean[] temp = new boolean[2000001];
		
		for(int n = 0; n < N; n++) {
			int num = Integer.parseInt(br.readLine());
			temp[num + 1000000] = true;
		}
		
		for(int n = 0; n < 2000001; n++) {
			if(temp[n]) {
				System.out.println(n - 1000000);
			}
		}
	}
}

 

'Algorithm' 카테고리의 다른 글

에라토스테네스의 체(JAVA)  (0) 2022.04.09
백준 17425번: 약수의합(JAVA)  (0) 2021.12.26
백준 17427번: 약수의합2(JAVA)  (0) 2021.12.26
백준 4375번: 1(JAVA)  (0) 2021.12.26
백준 9655번: 돌게임(JAVA)  (0) 2021.11.10

댓글