본문 바로가기

백준

[백준] 단어 정렬 (1181번)

728x90

코드 힌트

  1. 입력 처리:
    • 입력 스트림을 설정하여 테스트 케이스의 수를 읽습니다.
    • 각 문자열을 읽어서 중복되지 않도록 저장할 자료구조를 사용합니다.
  2. 중복 제거:
    • 중복된 항목이 허용되지 않는 자료구조를 사용하여 입력된 문자열을 저장합니다. 이 자료구조는 자동으로 중복된 항목을 제거합니다.
  3. 정렬 준비:
    • 저장된 문자열을 정렬하기 위해 리스트로 변환합니다.
  4. 정렬 기준 설정:
    • 문자열을 길이로 우선 정렬하며, 길이가 같을 경우에는 사전순으로 정렬합니다. 두 가지 기준을 사용하여 정렬을 수행합니다.
  5. 출력:
    • 정렬된 리스트의 각 문자열을 출력 스트림을 통해 출력합니다. 출력이 완료된 후 스트림을 닫아 모든 데이터가 제대로 출력되도록 합니다.

 


정답은 더보기 클릭

더보기
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
        // BufferedReader와 BufferedWriter를 사용해 입출력 처리
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        // 입력받은 테스트 케이스의 수를 읽음
        int n = Integer.parseInt(br.readLine());

        // 중복을 허용하지 않는 Set을 사용하여 고유한 문자열 저장
        Set<String> set = new HashSet<>();

        // 문자열을 읽어 Set에 추가 (중복된 문자열은 자동으로 제거됨)
        for (int i = 0; i < n; i++) {
            set.add(br.readLine());
        }

        // Set의 내용을 리스트로 변환하여 정렬을 준비
        List<String> list = new ArrayList<>(set);

        // 문자열을 길이 기준으로 오름차순 정렬, 길이가 같을 경우 사전순 정렬
        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                int lengthCompare = Integer.compare(s1.length(), s2.length());
                if (lengthCompare != 0) {
                    return lengthCompare; // 길이로 비교
                }
                return s1.compareTo(s2); // 길이가 같으면 사전순으로 비교
            }
        });

        // 정렬된 문자열을 출력
        for (String s : list) {
            bw.write(s + "\n");
        }

        // BufferedWriter의 남은 데이터를 출력
        bw.flush();
        bw.close();
    }
}
728x90

'백준' 카테고리의 다른 글

[백준] 최소공배수 (1934번)  (0) 2024.08.26
[백준] 카드2 (2164번)  (0) 2024.08.26
[백준] 나이순 정렬 (10814번)  (0) 2024.08.17
[백준] 터렛 (1002번)  (0) 2024.08.16
[백준] 스택 10828번  (0) 2024.08.15