PS/BOJ
백준 10989 수 정렬하기 3
_룰루
2021. 7. 12. 15:57
10989번: 수 정렬하기 3
첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.
www.acmicpc.net
수 정렬하기 1,2와 같은 문제지만 시간 제한 + 메모리 제한이 있다
여기서 제일 중요한게 메모리 제한임
그래서 구글링으로 카운팅 정렬을 이용해야한다 함
카운팅 정렬을 간단하게 정리하자면 어떤 데이터들이 들어있는 배열들이 있는데 각 배열의 요소들이 등장할 경우 그 요소들의 위치에 맞는 count 배열에 요소의 수만큼 카운트해서 count 배열에 저장함. 그리고 나서 count 배열에 존재하는 요소의 수만큼 인덱스를 출력해주면 됨
1. 수 정렬하기 2 코드를 그대로 붙여넣으니 메모리 초과로 실패❌
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
ArrayList<Integer> list = new ArrayList<Integer>();
StringBuilder sb = new StringBuilder();
int num = Integer.parseInt(br.readLine());
for(int i=0; i<num; i++){
list.add(Integer.parseInt(br.readLine()));
}
Collections.sort(list);
for(Integer i:list){
sb.append(i).append('\n');
}
System.out.println(sb);
}
}
2. 리스트를 배열로 바꾸고 카운트 해주는 것으로 변경
하지만 배열인덱스를 넘어가버려서 런타임 에러(ArraryIndexOutOfBounds)로 실패❌
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collections;
class Main{
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[] count = new int[10001];
//각 원소 갯수 저장함
for(int i=0; i<num; i++) {
int input = Integer.parseInt(br.readLine());
count[input]++;
} //여기까지 오케이
//존재하는 원소의 수만큼 i를 출력한다.
for(int i=1; i<=count.length; i++){
for(int k=0; k<count[i]; k++) {
sb.append(i).append('\n');
}
}
System.out.println(sb);
}
}
3. 배열 인덱스를 넘지 않기 위해 각 배열안의 요소가 1개 이상일 때만 출력해주니까 성공!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collections;
class Main{
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[] count = new int[10001];
//각 원소 갯수 저장함
for(int i=0; i<num; i++) {
int input = Integer.parseInt(br.readLine());
count[input]++;
} //여기까지 오케이
//존재하는 원소의 수만큼 i를 출력한다.
for(int i=1; i<=10000; i++){
if(count[i]>0) {
for (int k = 0; k < count[i]; k++) {
sb.append(i).append('\n');
}
}
}
System.out.println(sb);
}
}
반응형