본문 바로가기

코딩테스트/백준

[Java][백준-10989] 수 정렬하기 3

문제

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