PS/Sorting

백준 5648번: 역원소 정렬 (JAVA)

닻과매 2022. 4. 6. 13:55

https://www.acmicpc.net/problem/5648

 

5648번: 역원소 정렬

모든 원소가 양의 정수인 집합이 있을 때, 원소를 거꾸로 뒤집고 그 원소를 오름차순으로 정렬하는 프로그램을 작성하세요. 단, 원소를 뒤집었을 때 0이 앞에 선행되는 경우는 0을 생략해야합니

www.acmicpc.net

문제

모든 원소가 양의 정수인 집합이 있을 때, 원소를 거꾸로 뒤집고 그 원소를 오름차순으로 정렬하는 프로그램을 작성하세요.

단, 원소를 뒤집었을 때 0이 앞에 선행되는 경우는 0을 생략해야합니다.

입력

첫 번째로 입력되는 건 n (1 ≤ n ≤ 106)으로 사용자가 뒤이어 입력할 원소값을 결정합니다. 입력하는 줄에는 하나의 원소값 뿐만 아니라 여러 원소값도 들어갈 수 있습니다.

단, 입력하는 정수는 1012을 넘어선 안 됩니다.

출력

출력문은 위 문제 내용에 나와있는 정렬방법으로 정렬하여 아래 예제 출력을 참고하여 출력하세요.

 


 

풀이

풀이는 어렵지 않다. 뒤집는 건 StringBuilder에 담아 내장함수 reverse()를 쓰는게 제일 편해보인다. 범위가 범위다보니, long으로 써주는 것도 잊지 말자.

 

사실 풀이가 어려워서 적었다기보다는, EOF 처리 방법을 정리하고자 적었다. 이 파일을 제출할 경우, BufferedReader.readLine()은 마지막 줄을 이후에 null을 return한다. 다만 이클립스에서 엔터로 넘길 경우, 끝나지 않고 엔터값을 계속 출력한다. 이를 끝내기 위해, 윈도우는 마지막 입력까지 적고, 엔터치고 ctrl+Z를 누르면 된다.

자세한 논의는 https://www.acmicpc.net/board/view/39199 참고.

(22.04.20 추가: ctrl+z 키가 이클립스 기준 되게 안 먹는다..한 10번 중 한 번꼴로 되는 수준이다. 왜지?)

 

코드

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException{
        StringBuilder sb = new StringBuilder();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        List<Long> list = new ArrayList<>();
        while(st.hasMoreTokens()) {
            list.add(reverse(st.nextToken()));
        }
        String str = "";
        while((str = br.readLine()) != null) {
            st = new StringTokenizer(str);
            while(st.hasMoreTokens()) {
                list.add(reverse(st.nextToken()));
            }
        }

        Collections.sort(list);
        for (int i = 0; i < N; i++) {
            sb.append(list.get(i)+"\n");
        }
        System.out.println(sb.toString());
    }


    static long reverse(String num) {
        StringBuilder sb = new StringBuilder();
        sb.append(num);
        return Long.parseLong(sb.reverse().toString());
    }
}