Java/코딩테스트

[백준] 1181번: 단어 정렬 (JAVA)

다아빈 2025. 4. 10. 22:13
728x90
반응형

문제: https://www.acmicpc.net/problem/1181

문제 접근

문제에 나온대로 다음과 같이 생각했습니다:

  1. 문자열을 담을 리스트를 생성한다. (만약 이미 list에 있는 단어면 넣지 않는다)
  2. 문자열이 짧은 것부터 오름차순으로 정렬 (길이가 같으면 사전순으로 정렬)

사실 처음에는 Map에 문자열과 문자열길이를 넣을까 했는데, 리스트로 선택했습니다. (이유는 정렬할 때 리스트가 더 쉬운 거 같아서 입니다.)

리스트 생성하고 오름차순으로 정렬하는 것까지는 쉬웠는데... 문자열 비교하는 함수 equals 말고는 도저히 생각이 안 나더라구요 ㅎㅎ;; 그래서 바로 구글에 문자열 사전순 비교하는 법 찾아봐서 코드를 완성했습니다 ㅋㅋ..

이번에 오답노트 느낌으로 정리하고 나중에 이 문제가 생각 안 날 때 한 번 다시 풀어봐야겠어요 ㅠㅠ

전체 코드

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

public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int n = Integer.parseInt(br.readLine());
        List<String> list = new ArrayList<>();

        for(int i = 0;  i < n; i++) {
            String word = br.readLine();

            if(list.contains(word)) continue; // 중복단어 방지
            else list.add(word);
        }

        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
               if(s1.length() > s2.length()) return 1;
               else if(s1.length() < s2.length()) return -1;
               else return s1.compareTo(s2);
            }
        });

        for(String word : list) {
            bw.write(word + "\n");
        }

        bw.close();
    }
}

자바 리스트 정렬

기본적으로 오름차순으로 정렬할 때는 다음과 같이 사용합니다.

Collections.sort(list);

저는 문자열 리스트를 길이 순으로 정렬하고, 길이가 같으면 사전 순으로 정렬하기 위해서 다음과 같이 코드를 작성했습니다.

Collections.sort(list, new Comparator<String>() {
        @Override
        public int compare(String s1, String s2) {
           if(s1.length() > s2.length()) return 1;
           else if(s1.length() < s2.length()) return -1;
           else return s1.compareTo(s2);
        }
    });
  • Collections.sort(list, comparator): list를 내 방식대로 정렬할 거라는 뜻입니다.
  • new Comparator<String>() {...}: 그리고 문자열 비교 방법을 직접 정의합니다. 
  • compare(): Comparator은 인터페이스이므로 compare 함수를 통해 "어떻게 문자열을 비교할 것인지" 정의해줘야 합니다. 저는 다음과 같이 정의했습니다.
    - s1의 문자열이 더 긴 경우: 1 리턴
    - s2의 문자열이 더 긴 경우: -1 리턴
    - 둘의 문자열 길이가 같은 경우: compareTo()를 통해 사전 순으로 정렬, 이때 compareTo는 유니코드 값을 기준으로 값을 비교한다. 즉, 내부적으로 각 문자의 char 값을 하나하나 비교한다.

다음은 compare(s1, s2)의 리턴값의 의미를 나타낸 표입니다.

compare 메서드는 반환값이 음수이면 앞의 값(s1)이 먼저, 양수면 뒤의 값(s2)이 먼저 정렬됩니다!

 

역시 이번에도 역시 부족하다는 것을 또 느끼게 되었습니다! ㅋㅋ

 

읽어주셔서 감사합니다.

728x90
반응형