말하는 컴공감자의 텃밭

백준 1181번 단어정렬 S5 - Comparable 인터페이스 본문

알고리즘/Backjoon - Java

백준 1181번 단어정렬 S5 - Comparable 인터페이스

현콩 2024. 1. 3. 16:27
728x90

백준 1181번 단어정렬 S5

 

 

  1. 길이가 짧은 것부터
  2. 길이가 같으면 사전 순으로

1181번: 단어 정렬

 

간단했으나 Compare 인터페이스의 Sort를 이용할때 문자열의 길이도 고려하며 정렬해야했다.

Sort 함수 Override이 필요하다고 판단했으나 사용법이 헷갈려 검색을 활용했다.

자바에서 객체를 비교하는 방법은 Comparable 인터페이스를 구현하거나 Comparator 인터페이스를 이용하는 두 가지 방법이 있다.

  • Comparable
    • compareTo를 활용해서 요소를 비교하는데 메서드를 통해 인자로 넘어온 같은 타입의 다른 객체와 대소 비교를 한다. 메서드를 호출하는 객체가 인자로 넘어온 객체보다 작을 경우에는 음수를 리턴하고, 크기가 동일하다면 0, 클 경우에는 양수를 리턴해야하는 특징이 존재한다.
public class Player implements Comparable<Player> {
    // Fields, Getters, Setters 생략

    @Override
    public int compareTo(Player other) {
        return other.getScore() - this.getScore();
    }
}
List<Player> players = new ArrayList<>();
// ... (플레이어 객체 추가)

Collections.sort(players);

플레이어의 점수의 경우 숫자만 비교하면 되므로 간단하게 정렬이 된다.

하지만 다른 기준으로 정렬하고 싶다면 Comparator 을 사용해야한다.

  • Comparator
    • ****정렬하고자 하는 객체의 클래스에 Comparable 인터페이스를 구현할 수 없을 때 사용하는 방법이다 혹은 Comprable 인터페이스를 통해 이미 정렬기준이 정해져있지만 다른 기준으로 정렬하고 싶을때 사용하는 방법이다.
    public static <T> void sort(List<T> list, Comparator<? super T> c) {
        list.sort(c);
    }

 

sort 함수를 까보면 첫번째로 정렬 할 리스트와 두번째 기준인 Comparator를 받는다.

// sorting 길이를 비교하기 위해 Override
        Arrays.sort(arr, 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();
                }
            }
        })

 

그렇다면 Comparator<String> 인터페이스의 compare 메서드를 재정의해주어 새로운 기준인 length()를 넣어 o1, o2의 길이를 비교하여 더 큰 값을 return해주게 만들어 주면 된다.

여기서 람다를 활용 할 수 있는데

Java의 람다 표현식은 단일 메서드 인터페이스(기능 인터페이스)의 인스턴스를 표현하는 간결한 방법을 제공합니다. 기능적 인터페이스는 하나의 추상 메서드만 포함하고 람다 식의 대상으로 사용할 수 있는 인터페이스입니다.

 

정리하면 Java 8 이후로 코드를 간결하게 만들 수 있고 의도가 바로 보여 가독성이 좋아지기에 사용되는 방식이다.

// 람다식으로 작성
        Arrays.sort(arr, (o1, o2) -> {
            if (o1.length() == o2.length()) {
                return o1.compareTo(o2);
            } else {
                return o1.length() - o2.length();
            }
        });

 

간결하게 수정이 되었다.

 

 


최종 코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.util.*;
import java.io.*;
 
public class Main { // 1181번 문자열 정렬하기
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        HashSet<String> set = new HashSet<>();
        int N = Integer.parseInt(br.readLine());
        
        for(int i = 0; i<N; i++) {
            set.add(br.readLine());
        }
        int size =set.size();
        String [] arr = new String[size];
        set.toArray(arr);
        
        //람다식 사용
        Arrays.sort(arr, (o1, o2) -> {
            if (o1.length() == o2.length()) {
                return o1.compareTo(o2);
            } else {
                return o1.length() - o2.length();
            }
        });
        for(String s : arr) {
            sb.append(s);
            sb.append("\n");
        }
        System.out.println(sb);
 
    }
}
cs
728x90
Comments