이지은님의 블로그
[작심큰일] 250808 - 백준 1181번: 단어 정렬 본문
📜 백준 1181번: 단어 정렬
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
단, 중복된 단어는 하나만 남기고 제거해야 한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
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> set = new HashSet<>();
for (int i = 0; i < n; i++) {
set.add(br.readLine());
}
List<String> list = new ArrayList<>(set);
list.sort((a, b) -> {
if (a.length() == b.length()) {
return a.compareTo(b);
}
return a.length() - b.length();
});
for (String word : list) {
System.out.println(word);
}
}
}
문자열을 입력받고
set으로는 중복제거, list로는 정렬을 하기위해 저장한다.
.sort 람다식은 a, b각각 스트림객체들에 대해 어떻게 정렬할 것인지에 대해 정의할 수 있다.
if (a.length() == b.length())는 a와 b의 객체의길이가 같을 경우 사전순으로 문자열을 비교한다.
같지 않을 경우 길이가 짧은 순으로 정렬한다.
🪛 피드백
📝 코드 설명
- LinkedHashSet 으로 중복 제거와 입력 순서 유지
- ArrayList 로 변환 후 Collections.sort 와 Lamda 식을 사용해 길이와 사전 순 정렬
- 조건에 맞는 순서로 출력
📊 복잡도 분석
시간 복잡도: O(N log N) (N = 단어 개수) - 정렬 비용이 주를 이룸
공간 복잡도: O(N) (중복 제거 및 리스트 저장)
⚡ 최적화 팁
1. [LinkedHashSet] : 중복 제거 시 입력 순서 유지
2. [Comparator 와 Lamda] : Lamda 를 통해 길이와 사전 순 정렬을 한번에 할 수 있음
🎯 학습 포인트
- LinkedHashSet 사용법 - Lamda 사용
🔗 관련 문제
- 중복 제거 및 정렬 시 에는 Set → List → 정렬 이 유리 - 정렬 조건이 여러 개인 것을 대비해 Lamda 연습
'알고리즘 공부 > [JAVA] 코드카타' 카테고리의 다른 글
| [작심큰일] 250810 - leetcode 1385번: Find the Distance Value Between Two Arrays (1) | 2025.08.10 |
|---|---|
| [작심큰일] 250809 - 백준 25325번: 학생 인기도 측정 (1) | 2025.08.09 |
| [작심큰일] 250806 - leetcode 232번: Implement Queue using Stacks (4) | 2025.08.06 |
| [작심큰일] 250805 - 백준 10820번: 문자열 분석 (3) | 2025.08.05 |
| [작심큰일] 250804 - 백준 1032번: 명령 프롬프트 (3) | 2025.08.04 |