[TIL] 백준 1181번, 단어 정렬

·2023년 3월 1일
0

알고리즘

목록 보기
8/11
post-thumbnail

문제


입력값

13
but
i
wont
hesitate
no
more
no
more
it
cannot
wait
im
yours

출력값

i
im
it
no
but
more
wait
wont
yours
cannot
hesitate

해결 방법

  1. 입력 받은 N의 길이를 가지는 문자열 배열 s을 선언한다.
  2. 반복문을 통해 다음 입력 받는 문자열들을 미리 선언한 s에 입력한다.
  3. Arrays.sort()를 통해 배열s을 정렬한다.
    3-1. Arrays.sort()Comparator를 통해 객체를 비교하며 정렬할 수 있다.
  4. 사전순으로 정렬된 s는 중복을 제외하고 값을 출력한다.

코드

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[] s = new String[n];

        for(int i = 0; i < n; i++) {
            s[i] = br.readLine();
        }

        Arrays.sort(s, 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(); 
                }
            }
        });

        StringBuilder sb = new StringBuilder();

        sb.append(s[0]).append("\n");

        for(int i = 1; i< n; i++) {
            if(!s[i].equals(s[i-1])){
                sb.append(s[i]).append("\n");
            }
        }
        System.out.println(sb);

    }
}

new Comparator<? super T>

Arrays.sort(s, 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(); 
                }
            }
        });

💡new Comparator<? super T>Arrays.sort() 메서드 안에서 두 개의 값을 비교할 수 있도록 해주는 인터페이스이다.

선언과 함께 compare()가 오버라이딩 되고, Comparator의 자료형이 어떤 타입인지 상관없이 compare()메서드는 int 타입만 반환한다.

🤔왜 int타입만 반환하지?
compare()메서드는 3가지 리턴값에 의해 비교한 값들의 위치가 결정된다.
1. 양의 정수
2. 0
3. 음의 정수
💡 o1.length() - o2.length()를 보면 o1이 o2보다 길이가 길 경우, 양의 정수가 반환 된다. 그러면 o1이 o2보다 긴 문자열이라는 것이기 때문에 둘의 위치를 변경한다.
음의 정수나 위치를 변경하지 않는다.

🤔 그럼 0이 반환될 경우는?
음의 정수를 반환한 것처럼 위치 변경을 하지 않는다. 하지만 여기서는 사전순 정렬이 필요하므로 별도의 로직이 필요하다.

compareTo()

compareTo()메서드는 문자열을 비교하기 위해 사용되지만, 사전 순서로 값을 비교할 수 있다.

o1.compareTo(o2)에서 o1이 o2보다 사전순으로 앞서면 음수를 반환하고, 뒤에 있으면 양수를 반환해 정렬 순서를 변경한다.

profile
🧑‍💻백엔드 개발자, 조금씩 꾸준하게

0개의 댓글