[BaekJoon] #1181 단어정렬

현굥·2024년 10월 10일

BaekJoon

목록 보기
46/53

문제이해

단어를 주어진 기준에 따라 정렬하는 문제입니다.

단어의 개수를 입력받고, 알파벳 소문자로 이루어진 단어가 주어지고 조건에 따라 길이가 짧은 것 부터 정렬하고, 길이가 같으면 사전순으로 정렬하면 됩니다.

문제핵심

람다식, compareTo(), 중복 제거

람다식을 사용하면 Comparator를 간결하게 표현할 수 있습니다.

compareTo() 메서드는 문자열을 사전순으로 비교하는데 유용합니다.

중복 제거는 별도로 Set을 사용할 필요 없이 간단한 조건문으로 해결할 수 있습니다.

Arrays.sort(), Comparator

Arrays.sort() 메서드는 배열을 정렬할 때 유용합니다.

두 번째 파라미터로 Comparator 인터페이스를 구현한 객체나 람다식을 전달하면, 직접 작성한 비교 로직에 따라 정렬할 수 있습니다.

익명클래스 작성

Comparator를 사용하여 익명 객체를 생성하고, 객체 간의 비교 기준을 설정할 수 있습니다.

위 코드를 람다식으로 변환하면 더 간결하게 작성할 수 있습니다.

람다식

return문에서는 비교 기준을 설정합니다. 비교 결과는 다음과 같습니다:

음수: 첫 번째 객체가 두 번째 객체보다 앞에 위치 (순서 변경 X)
양수: 첫 번째 객체가 두 번째 객체보다 뒤에 위치 (순서 변경 O)
0: 두 객체의 순서 변경X

compareTo

ccompareTo() 메서드는 두 문자열을 사전순으로 비교합니다.

예를 들어, s1.compareTo(s2)는 다음과 같은 결과를 반환합니다.

음수: s1이 s2보다 사전순으로 앞에 있을 경우 : 순서변경X
양수: s1이 s2보다 사전순으로 뒤에 있을 경우 : 순서변경O
0: 두 문자열이 동일할 경우 : 순서변경X

중복제거

equals() 메서드를 사용하여 현재 단어가 이전 단어와 동일한지 확인한 후, 동일하지 않으면 출력하면 됩니다.

이때, 첫번째 원소는 비교할 이전의 값이 없기 때문에 첫번째 값은 미리 sb에 append해주고, 1번 인덱스부터 비교 해줘야 합니다.

code

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.Comparator;

public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        String[] arr = new String[n];
        for(int i=0; i<n ; i++){
            arr[i] = br.readLine();
        }

        Arrays.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                if (s1.length() == s2.length()) {
                    return s1.compareTo(s2); // 두 문자열을 사전순으로 비교하여 결과에 따라 음수, 0, 양수로 출력함 
                } else {
                    return s1.length() - s2.length();
                }
            }
        });


        /*Arrays.sort(arr,(s1, s2) ->{
           if(s1.length() == s2.length()){ // 문자열의 길이가 같으면
               return s1.compareTo(s2); // 사전순으로 정렬
           }else{                          // 문자열의 길이가 다르면
               return s1.length() - s2.length(); // 길이순으로 정렬
           }
        });*/

        StringBuilder sb = new StringBuilder();
        sb.append(arr[0]).append('\n');

        for (int i = 1; i < n; i++) {
            // 중복되지 않는 단어만 출력
            if (!arr[i].equals(arr[i - 1])) {
                sb.append(arr[i]).append('\n');
            }
        }
        System.out.println(sb);

}
}

0개의 댓글