수 정렬하기 3
시간 제한메모리 제한제출정답맞은 사람정답 비율
5 초 (하단 참고) | 8 MB (하단 참고) | 129846 | 29380 | 21612 | 23.384% |
문제
N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.
입력
첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.
출력
첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.
풀이1
이전 단계 문제에서 사용한 Arrays.sort를 이용해도 풀이가 되는 것을 확인할 수 있다
import java.io.*;
import java.util.Arrays;
public class Main {
static int[] arr;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
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++)bw.write(arr[i]+"\n");
bw.flush();
bw.close();
}}
*메모리 사용 약 340,000 KB
풀이2
문제가 의도한 카운팅(계수) 정렬을 사용해 풀이한다. 수의 크기가 10,000보다 작거나 같기 때문에 10001 크기의 배열을 만든다.
카운팅 배열은 각 index에 해당하는 숫자를 세어준 뒤 누적합 배열로 만들어줘야 한다. 하지만 그것은 정렬된 배열을 만드는 경우며 이 문제에서는 위치 상관없이 곧바로 출력하기만 하면 되므로 값을 바로 기록하고 카운팅 배열에 기록된 수만큼 출력하기만 하면 된다.
import java.io.*;
public class Main {
static int[] arr;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int[] counting = new int[10001]; //카운팅 배열을 만들어준다
int N = Integer.parseInt(br.readLine());
while(N-->0) {
counting[Integer.parseInt(br.readLine())]++; //배열 안에 값을 넣어주면서 세어준다
}
for(int i=0; i<10001; i++) { //기록된 수만큼 index를 호출한다
for(int j=0; j<counting[i]; j++) {
bw.write(i+"\n");
}
}
bw.flush();
bw.close();
}}
*조금이지만 메모리 부분이 개선되었다
'Study > Baekjoon' 카테고리의 다른 글
Baekjoon11650,11651: 좌표 정렬하기 (0) | 2021.11.06 |
---|---|
Baekjoon1427: 소트인사이드, System.in.read(); (0) | 2021.11.05 |
Baekjoon2750,2751: 수 정렬하기(Scanner, Buffer) (0) | 2021.11.03 |
Baekjoon13305*: 주유소 (0) | 2021.11.02 |
Baekjoon1541: 잃어버린 괄호 (0) | 2021.11.02 |