문제
N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.
요구사항 확인
-첫번째에 숫자를 입력받아 입력받을 숫자 개수를 확인한다. 개수 만큼 while 문으로 숫자를 받는다.
-숫자는 자연수, 즉 0 보다 큰 수만 입력받는다.
-숫자는 최대 천만개가 주어질 수 있다.
코드 설계
Set<Integer> set = new HashSet<>();
int numberIdx = Integer.parseInt(bufferedReader.readLine()); //입력받는 숫자 개수
int count = 10001; //입력받는 숫자
boolean[] booleans = new boolean[count]; //특정 숫자 등장 여부
int[] array = new int[count]; //특정 숫자 등장 횟수
숫자는 10,000까지 주어지고, 개수는 최대 1천만개까지 주어지기 때문에 숫자 중복 가능성이 높다.
특정숫자가 등장하는 횟수를 배열로 받는다.
특정숫자가 등장하는지 여부도 배열로 받는다.
private void getNumber(Set<Integer> set, int numberIdx, int[] array) throws IOException {
int i = 0;
while (i < numberIdx) { //numberIdx = 숫자개수 N
int input = Integer.parseInt(bufferedReader.readLine());
set.add(input);
array[input] = array[input] + 1; //등장횟수 증가
i++;
}
}
먼저 숫자를 입력받아 Set에 숫자 input 을 담는다. 그와 동시에 배열 array 의 input에 해당하는 인덱스의 값을 증가시켜준다.
등장횟수에 해당한다.
private void setIndex(Set<Integer> set, boolean[] booleans) {
set.forEach(e -> booleans[e] = true);
}
boolean 배열의 특정 인덱스값을 true로 설정해준다. Set에 담긴 숫자가 인덱스에 해당한다. 등장여부를 알려주는 역할을 한다.
private void printNumber(boolean[] booleans, int[] array) throws IOException {
String newLine = "\n";
int count = booleans.length;
int i = 0;
int j;
while (i < count) {
if (booleans[i]) { //등장여부
j = 0;
int reps = array[i];
while (j < reps) { //등장횟수
bufferedWriter.write(String.valueOf(i));
bufferedWriter.write(newLine);
j++;
}
}
i++;
}
}
요구사항 대로 출력한다. 반복문을 돌면서 boolean[] 의 각 인덱스에 접근한다.
만약 true에 해당한다면 값이 등장했다는 의미이다. 다음으로 배열 array의 인덱스에 접근해 등장횟수를 가져와 출력한다.
전체 코드
import java.io.*;
import java.util.HashSet;
import java.util.Set;
public class Main {
private Reader reader;
private Writer writer;
private BufferedReader bufferedReader;
private BufferedWriter bufferedWriter;
public static void main(String[] args) {
new Main().execute();
}
private void execute() {
try{
resourceOpen();
Set<Integer> set = new HashSet<>();
int numberIdx = Integer.parseInt(bufferedReader.readLine());
int count = 10001;
boolean[] booleans = new boolean[count];
int[] array = new int[count];
getNumber(set, numberIdx, array);
setIndex(set, booleans);
printNumber(booleans, array);
bufferedWriter.flush();
} catch (IOException ignored){
} finally {
try {
resourceClose();
} catch (IOException io){
io.printStackTrace();
}
}
}
private void getNumber(Set<Integer> set, int numberIdx, int[] array) throws IOException {
int i = 0;
while (i < numberIdx) {
int input = Integer.parseInt(bufferedReader.readLine());
set.add(input);
array[input] = array[input] + 1;
i++;
}
}
private void setIndex(Set<Integer> set, boolean[] booleans) {
set.forEach(e -> booleans[e] = true);
}
private void printNumber(boolean[] booleans, int[] array) throws IOException {
String newLine = "\n";
int count = booleans.length;
int i = 0;
int j;
while (i < count) {
if (booleans[i]) {
j = 0;
int reps = array[i];
while (j < reps) {
bufferedWriter.write(String.valueOf(i));
bufferedWriter.write(newLine);
j++;
}
}
i++;
}
}
private void resourceOpen(){
reader = new InputStreamReader(System.in);
writer = new OutputStreamWriter(System.out);
bufferedReader = new BufferedReader(reader);
bufferedWriter = new BufferedWriter(writer);
}
private void resourceClose() throws IOException {
if (reader != null) {
reader.close();
}
if (writer != null) {
writer.close();
}
if (bufferedReader != null) {
bufferedReader.close();
}
if (bufferedWriter != null) {
bufferedWriter.close();
}
}
}
'코딩테스트 > 백준' 카테고리의 다른 글
[Java][백준-2751] 수 정렬하기 2 (0) | 2022.06.20 |
---|