[백준-자바] N_1181 단어 정렬

0woy·2022년 12월 23일
0

코딩테스트

목록 보기
2/17

📜 문제

첫째줄에는 단어의 개수
둘째 줄부터 N개의 단어 입력

  • 길이 순 정렬
  • 길이가 같으면 사전 순 정렬
  • 중복 값이 있다면 하나만 출력

✍ 부분 코드 설명

// 필요 라이브러리 import
import java.io.*;
import java.util.*;

public class N_1181 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine()); // 단어의 개수
        String[] str = new String[N];

        for (int i = 0; i < N; i++)
            str[i] = br.readLine();

N에 입력 받은 단어의 개수를 할당한 후, 반복문을 이용해 단어 N개를 입력하여 순서대로 문자열 배열인 str에 할당한다.


중복값을 제거하기 위한 코드

중복된 값은 한 번만 출력해야 하므로 우리는 HashSet을 이용해 아예 중복값을 없앨 것이다.

// 중복값을 제거 하기 위해 배열 ->  HashSet 변경
HashSet<String> hashSet = new HashSet<>(Arrays.asList(str));

// 중복값이 제거된 배열 변환
String[] resArray = hashSet.toArray(new String[0]); 

HashSet은 입력한 순서를 보장하지 않지만, 어차피 우리는 정렬된 결과만 도출하면 되기 때문에 상관없다!

문자열이 담긴 String str 배열을 HashSet으로 변환한다.

중복값을 제거한 후 toArray(new String[0])을 이용하여 HashSet을 다시 배열로 변환하여 resArray에 넘겨준다.

new String[0] : 배열의 크기를 0으로 지정하면 자동으로 크기가 지정된다.


정렬 코드

Arrays.sort(resArray, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                // 문자열 길이가 같다면 오름차순
                if (o1.length() == o2.length())
                    return o1.compareTo(o2);
                return o1.length() - o2.length();
            }
        });

Arrays.sort의 compare 함수를 재정의 하여 작성한다.
문자열의 길이 순으로 정렬을 하되, 길이가 같다면 compareTo() 함수를 이용하여 문자열을 사전순으로 정렬하도록 코드를 작성한다.


StringBuilder 객체를 선언하여 정렬된 resArray의 단어들을 모두 저장하고, 마지막에 한 번에 출력한다.

 StringBuilder sb = new StringBuilder();
        for (int i = 0; i < resArray.length; i++)
            sb.append(resArray[i]).append('\n');

        System.out.println(sb);

🍳 전체 소스 코드

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

public class N_1181 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine()); // 단어의 개수
        String[] str = new String[N];

        for (int i = 0; i < N; i++)
            str[i] = br.readLine();

        // str 배열을 HashSet으로 변환
        HashSet<String> hashSet = new HashSet<>(Arrays.asList(str));

        String[] resArray = hashSet.toArray(new String[0]); // 중복이 제거된 후 배열 변환

        // 문자열 길이순 정렬
        Arrays.sort(resArray, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                // 문자열 길이가 같다면 오름차순
                if (o1.length() == o2.length())
                    return o1.compareTo(o2);
                return o1.length() - o2.length();
            }
        });

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < resArray.length; i++)
            sb.append(resArray[i]).append('\n');

        System.out.println(sb);

        br.close();
    }
}

✨ 결과

0개의 댓글