https://www.acmicpc.net/problem/1181
Problem 💻
문제
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
단, 중복된 단어는 하나만 남기고 제거해야 한다.
입력
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
출력
조건에 따라 정렬하여 단어들을 출력한다.
Solution 💡
주어진 단어들을 조건에 맞게 정렬하는 문제이다
- 글자의 길이로 정렬
- 길이가 같으면 사전순 정렬
단, 중복 단어를 하나면 표현한다.
중복을 제거하기 위해 `Set` 자료구조를 이용했고 그걸 `List`로 컨버팅해서 정렬을 진행했다.
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을 사용해 중복 제거
Set<String> set = new HashSet<>();
for (int i = 0; i < n; i++) {
set.add(br.readLine());
}
// Set을 List로 변환
List<String> list = new ArrayList<>(set);
// 정렬: 길이 기준 → 길이가 같으면 사전순
Collections.sort(list, (o1, o2) -> {
if (o1.length() == o2.length()) {
return o1.compareTo(o2); // 사전순 정렬
}
return o1.length() - o2.length(); // 길이 기준 정렬
});
// 출력
StringBuilder sb = new StringBuilder();
for (String word : list) {
sb.append(word).append("\n");
}
System.out.println(sb);
}
}
중복을 제거하기 위해 `Set`, 그리고 정렬을 하기 위해 `List`로 변환 후 사용했는데 위 과정을 한번에 처리할 수 있는게 `TreeSet`이다. `TreeSet`은 `Set`의 성질과 정렬을 모두 가지고 있으므로 해당 문제에 유용하게 사용가능하다.
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());
// TreeSet을 사용해 중복 제거 및 정렬
Set<String> set = new TreeSet<>((o1, o2) -> {
if (o1.length() == o2.length()) {
return o1.compareTo(o2); // 길이가 같으면 사전순 정렬
}
return o1.length() - o2.length(); // 길이 기준 정렬
});
for (int i = 0; i < n; i++) {
set.add(br.readLine());
}
// 출력
StringBuilder sb = new StringBuilder();
for (String word : set) {
sb.append(word).append("\n");
}
System.out.println(sb);
}
}
'코딩테스트 > 백준' 카테고리의 다른 글
[코딩테스트] 백준 24444번 알고리즘 수업 - 너비 우선 탐색 1 - Java (0) | 2024.12.07 |
---|---|
[코딩테스트] 백준 24479번 알고리즘 수업 - 깊이 우선 탐색1 - Java (0) | 2024.12.07 |
[코딩테스트] 백준 18870번 좌표 압축 - JAVA (1) | 2024.12.05 |
[코딩테스트] 백준 1946번 신입사원 - JAVA (0) | 2024.12.04 |
[코딩테스트] 백준 1026번: 보물 - JAVA (0) | 2024.12.04 |