백준 2751문제 : 수 정렬하기 2

백준 2751

백준 2751문제 수 정렬하기 2

시간 제한메모리 제한제출정답맞은 사람정답 비율
2 초256 MB3727811358733134.281%

문제

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

입력

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

출력

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

예제 입력 1 복사

예제 출력 1 복사

 

처음 이 문제를 봤을 때는 엄청 쉬운문제라고 생각해서 정답 비율이 34%밖에 안되는 것에대해 의문이 들었습니다. 하지만 알고리즘을 짜보니 왜 34%인지 알겠더라구요. 먼저 갯수가 1 ≤ N ≤ 1,000,000 개 주어집니다. 하지만 시간 제한은 2초구요. 2초안에 정렬을 끝내야 되는 문제입니다. 즉 어떤 정렬 방법이 가장 최적화 인지를 테스트하는 문제라고 보시면 됩니다.

처음 제가짠 소스는 이렇습니다.

입력은 Scanner로 받았고, Collections.sort()를 사용해 정렬을 해주었는데요, 이 문제의 정답으로써는 동일하지만 시간초과가 되어 실패하게 되었습니다.

어떤게 문제인지 살펴보도록 하겠습니다.

시간복잡도

시간복잡도는 문제를 해결하는데 걸리는 시간과 함수 관계를 가르킵니다.

이 문제의 주어진 시간은 2초이기 때문에 2초안에 모든걸 해결해야 합니다.

먼저 입력을 받을 때도 시간복잡도가 있습니다.

입력방식수행시간(초)
java.util.Scanner6.068
java.io.BufferedReader0.934

각 언어별 input method 비교

Scanner는 BufferedReader에 비해 많은 수행시간 필요합니다.

그래서 이 문제에서는 BufferedReader를 사용해야 합니다.

다음은 정렬 방식입니다.

버블정렬,선택정렬,삽입정렬은 시간복잡도가 O(n^2) 을 가지고 있습니다.
Collections.sort는 시간복잡도가 O(n*log(n)) 를 가지고 있습니다. 이 복잡도는 퀵 정렬,힙정렬이랑 동일한 속도입니다.

그러므로 Collections.sort를 이용해서 정렬을 해주도록 하겠습니다.

 

정답

입력받는 클래스는 BuffereReader를 사용을 했습니다. 처음에 생성할 배열의 크기를 정하고, 그 배열에 넣어주는 방법을 했습니다. 여기서는 int를 사용했는데 Integer를 하게되면 계속 새로운 객체를 생성하기 때문에 시간초과가 뜰 가능성이 있어서, 한꺼번에 wapper 클래스로 변경해주었습니다.

 

댓글

이 블로그의 인기 게시물

Filter url 제외시키기

[Spring,Java] Validator 구현하기

[Spring] Mock framework에 대하여