단어 정렬

곽지욱·2024년 1월 27일

BOJ

목록 보기
38/69

1181번 : 단어 정렬

  1. 단어를 길이순으로 정렬한 뒤, 길이가 같을 경우 사전순으로 정렬 (알파벳순)
  2. 중복되는 단어가 있을 경우 한 번만 출력함
  • 배열을 특정한 규칙에 의해 정렬하고 싶은 경우 Arrays.sort 메소드에 Comparator 을 구현하면 됨.
  • Arrays.sort() 는 단순 배열을 오름차순으로 정렬해주는 것 뿐만 아니라 사용자에 의해 구현될 수도 있음

  • 여기서 Comparator<?superT>c 에 대한 이해가 필요한데, Arrays.sort() 메소드 안에는 두 객체(원소)를 비교하여 위치를 바꿀지 말지 판단하면서 정렬을 한다.

  • 기본적으로 Comparator 는 객체를 비교할 수 있도록 해주는 인터페이스이다. 보통,int , char , double 등의 자바에서 기본적으로 제공하는 자료형들은 비교가 가능하지만

  • 사용자가 사용자 클래스를 만들어 비교한다거나, 특정 규칙에 의해 비교를 하고 싶은 경우에는 Comparator를 구현해야 한다.

"<? super T>" 는 상속관계에 있는 타입만 자료형으로 받겠다는 의미이다. T 타입이 자식클래스가 되고, T의 상속관계에 있는 타입까지만 허용하겠다는 의미임.

쉽게 T = Type 을 의미하며, 객체, 자료형 등의 다양한 타입 중 하나를 설정할 수 있다는 것.


List<? super Number> myList = new ArrayList<>();
myList.add(10);        // Integer는 Number의 하위 타입이므로 추가 가능
myList.add(3.14);      // Double은 Number의 하위 타입이므로 추가 가능
Number num = (Number) myList.get(0);  // 가져온 요소의 타입은 Number로 캐스팅 가능

이런식으로 <? super T> 는 특정 타입 또는 그 타입의 상위 타입을 받을 수 있는 유연성을 제공할 수 있고, 메서드나 클래스에서 다양한 타입의 객체를 처리할 수 있도록 도와줌.

문제 풀이

문제에서 우리가 정렬할 배열의 타입은 String 임. 즉 T는 String이 됨


import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        //단어를 길이순으로 정렬한 뒤, 길이가 같을 경우 사전순으로 정렬해야함.

        Scanner sc = new Scanner(System.in);

        int N = sc.nextInt();

        String wd [] = new String[N];


        for (int i = 0; i<wd.length; i++){
            wd[i] = sc.next();
        }

        Arrays.sort(wd, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {

                if(o1.length() == o2.length()){
                    return o1.compareTo(o2);
                }
                else {
                    return o1.length() - o2.length();
                }


            }
        });

        System.out.println(wd[0]);

        for(int i = 1; i<N; i++){


            if(!wd[i].equals(wd[i -1])){
                System.out.println(wd[i]);
            }
        }


    }
}
  1. 여기서 compare 메소드 리턴 타입이 int 형인 이유는 , 기본적으로 compare 메소드는 3가지 리턴 값에 의해 위치를 바꿀지 말지를 결정한다.
  • 양의 값
  • 0
  • 음의 정수

양의 값을 가질 경우는 Arrays.sort()에 의해서 위치를 바꾸고 0이나 음의 정수인 경우 두 객체의 위치는 바뀌지 않음

Ex) {3,1,4} 라는 배열이 있다고 하자

3 - 1 = 양의 값 -> 위치 바꿈
3 - 4 = 음의 값 -> 위치 바꾸지 않음

.... -> {1,3,4} 오름차순으로 정렬됨.

    Arrays.sort(wd, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            if (o1.length() == o2.length()) {
                return o1.compareTo(o2);
            } else {
                return o1.length() - o2.length();
            }
        }
    });
  1. Arrays.sort 메서드를 사용하여 문자열 배열 wd 를 정렬하고 Comparator를 람다식으로 구현함. (길이가 같으면 사전순으로 정렬하고,길이가 다르면 길이순으로 정렬함.)

  2. 나머지는 중복을 제거하기 위해서 정렬된 배열의 첫 번째 원소를 출력한 후, if 조건문으로 현재 원소가 이전 원소와 같지 않을 경우에만 출력하도록 한다.

0개의 댓글