백준 1181번 단어 정렬 - 자바 스트림 활용

728x90

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

 

1181번: 단어 정렬

첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.

www.acmicpc.net


 


첫 번째 줄에 n개의 단어를 나타내는 수가 있습니다.

그 수 만큼 단어가 나옵니다.

정렬의 조건은 두 가지 입니다.

1. 길이가 짧은 순서대로

2. 같은 길이는 사전 순서대로

그렇게 정렬해서 출력해주면 됩니다.

* 여기서 같은 단어는 하나만 출력하면 됩니다.


해설 코드

import java.util.Comparator;
import java.util.HashSet;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        HashSet<String> hs = new HashSet<>();
        int n = sc.nextInt();
        for (int i=0; i<n; i++){
            hs.add(sc.next());
        }
        hs.stream().sorted()
                .sorted(Comparator.comparingInt(String::length))
                .forEach(System.out::println);
    }
}



 

 

해설

1. 입력은 Scanner로 입력 받았습니다.

2. 중복 제거를 위해 HashSet 를 사용했습니다.


1. 첫 번째 줄로 입력되는 n를 받습니다.

2. n만큼 반복하여 HashSet에 만들어 줍니다.

* HashSet은 중복을 허용하지 않기 때문에 add 할 때 부터 중복이 제거 됩니다.


이제 정렬해서 출력만 하면 되겠죠?

1. 중복이 제거된 hs를 스트림으로 만들어 sorted()로 한번 정렬해줍니다.

그러면 사전 순서대로 정렬이 됩니다.

2. 사전 순서대로 정렬이 된 상태에서 다시 정렬을 해주는데, 이 때 compare를 사용해

length를 비교하여 정렬하도록 합니다.

람다로 한다면

3. length로 다시 정렬된 상태에서 forEach()를 통해 출력합니다.


반응형