[BOJ 길라잡이/Java] 6일차 #1181 단어 정렬

2025. 3. 12. 14:34· Languages/Java
목차
  1. 알고리즘 분류
  2. Arrays.sort + Comparator compare 메소드 구현
  3. Arrays.sort 정렬하기

알고리즘 분류

- 문자열

- 정렬

 

이전에 알고리즘 스터디에서 풀었던 문제인데

문제를 보자마자 아 어떻게 하더라.. thenComapring이런거 써서

연결했던 것 같은데.. 밖에 생각 안나더라

여태까지 Arrays.sort에 compare 메서드 구현하는 것도 여러 번 했었는데 잘 기억 안남 ㅜㅜ

 

이번에 제대로 정리해보자

먼저 내가 푼 방법은 구글링을 통해 찾은 compare 메서드다.

 

Arrays.sort + Comparator compare 메소드 구현

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

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());
        HashSet<String> set = new HashSet<>();
        for (int i = 0; i < N; i++) {
            set.add(br.readLine());
        }

        String[] words = set.toArray(new String[0]);

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

        for (int i = 0; i < words.length; i++) {
            System.out.println(words[i]);
        }
        
    }
}

중복값 제거를 위해 set에 값들을 넣어줬고,

set을 배열로 변환했다.

String[] words = set.toArray(new String[0]);

과 같이 작성했다.

 

이후 Arrays.sort에 Comparator를 써서 compare 메소드를 구현했다.

길이가 짧은 것부터 -> 길이가 같으면 사전 순으로 정렬해야 하므로

if 길이가 같으면 사전 순으로 정렬, 그렇지 않으면 길이순 정렬을 한다.

 

단어 사전순 정렬은 compareTo() 메소드를 쓰면 된다!

 

Arrays.sort 정렬하기

Arrays.sort는 기본적으로 인자를 2가지 받는다.

Arrays.sort(arr, new Comparator<>)

보편적으로 Arrays.sort(arr) 이렇게 인자를 하나만 줄 경우 Comparator는 default 값으로 적용되어 진행되는 것이다.

(정수 정렬할 때는 default 값으로 진행해도 무리가 없다.)

 

그러나 문자열을 정렬하기 위해서는 따로 재정의가 필요하다. (그냥 default로 둘 경우 사전 순 정렬)

- Arrays.sort()의 Comparator 재정의

Arrays.sort(arr, new Comparator<String>() {
	
    });

Comparator 객체를 생성하여 넣어준다.

 

- Comparator에 있는 메서드 compare 오버라이딩

(기존에 있는 Comparator 인터페이스로 정의된 compare 함수 재정의)

Arrays.sort(arr, new Comparator<String>() {
		@Override
        public int compare(String s1, String s2) {
        
        }
    });

 

- 문자열의 길이 정렬

Arrays.sort(arr, new Comparator<String>() {
		@Override
        public int compare(String s1, String s2) {
        	return s1.length() - s1.length();
        }
    });

 

- 문자열 길이가 같다면 사전 순 정렬

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

 

예전에 썼던 thenComparing은 뭐였는지 보기로 했다.

package B1181_단어정렬;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

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());
        Set<String> words = new HashSet<>();

        for(int i = 0; i < N; i++) {
            String word = br.readLine();
            words.add(word);
        }

        List<String> wordsList = new ArrayList<>(words);
        wordsList.sort(Comparator.comparingInt(String::length) // 길이가 짧은 것부터
                .thenComparing(Comparator.naturalOrder())); // 길이가 같으면 사전 순으로

        for (String word : wordsList) {
            System.out.println(word);
        }

    }
}

함수형 인터페이스의 특징을 활용해 간결하게 적은 버전이다.

Comparator.comparingInt(String::length)를 통해 String 객체의 길이를 비교하는 Comparator를 생성하고

이후 thenComparing(Comparator.naturalOrder())를 통해 추가적인 Comparator를 지정한다.

 

흠 이 방법보다는 위처럼 Comparator의 compare 메소드 재정의가 직관적이고

작성하기 편할 것 같다!

'Languages > Java' 카테고리의 다른 글

[BOJ 길라잡이/Java] 7일차 #11651 좌표 정렬하기 2  (0) 2025.03.17
[BOJ 길라잡이/Java] 7일차 #11650 좌표 정렬하기  (0) 2025.03.17
[BOJ 길라잡이/Java] 5일차 #1026 보물  (0) 2025.03.11
[BOJ 길라잡이/Java] 5일차 #1406 에디터  (0) 2025.03.11
[BOJ 길라잡이/Java] 5일차 #10866 덱  (0) 2025.03.11
  1. 알고리즘 분류
  2. Arrays.sort + Comparator compare 메소드 구현
  3. Arrays.sort 정렬하기
'Languages/Java' 카테고리의 다른 글
  • [BOJ 길라잡이/Java] 7일차 #11651 좌표 정렬하기 2
  • [BOJ 길라잡이/Java] 7일차 #11650 좌표 정렬하기
  • [BOJ 길라잡이/Java] 5일차 #1026 보물
  • [BOJ 길라잡이/Java] 5일차 #1406 에디터
효딩
효딩
개ㄱ발은 기세다. 줄여서 객기.
효딩
hyoding
효딩
전체
오늘
어제
  • 분류 전체보기 (245)
    • SKKU SW (30)
      • Computer Architecture (14)
      • Database (4)
      • Computer Network (3)
      • Operating System (7)
      • Mobile App Programming (2)
    • SuperCoding (68)
    • CS (8)
    • Web Programming (19)
    • Cloud (13)
    • Languages (45)
      • Python (8)
      • Java (37)
    • Supporters (8)
      • MoteMote (6)
      • NHN Cloud (2)
    • Certification (27)
      • Network Advisor (14)
      • ADsP (10)
      • Engineer Information Proces.. (3)
    • Finance (9)
      • 경제금융용어 (3)
    • Woori FISA (14)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 네트워크관리사 커트라인
  • 서버생성
  • 네트워크관리사2급 공부방법
  • AWS
  • 우리에프아이에스
  • 네트워크관리사2급 필기
  • 앱개발
  • 봐
  • Kotlin
  • 우리FISA
  • rds local 접속
  • 인프라
  • 서버배포
  • 네트워크관리사 후기
  • 클라우드
  • 코틀린
  • 네트워크관리사
  • 우리fis아카데미
  • 클라우드 서비스
  • 코틀린문법
  • 서버개발
  • 네트워크관리사 합격
  • nhn cloud
  • 네트워크관리사2급
  • 인프라개발
  • K-디지털트레이닝
  • 클라우드서비스개발
  • apppaas
  • 글로벌소프트웨어캠퍼스
  • 네트워크관리사 준비물

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
효딩
[BOJ 길라잡이/Java] 6일차 #1181 단어 정렬
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.