CodingTest/Baekjoon
[백준]1181번 단어 정렬(JAVA)
iihye_
2023. 8. 15. 23:12
0. 문제 링크
https://www.acmicpc.net/problem/1181
1181번: 단어 정렬
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
www.acmicpc.net
1. 문제 설명
1) 단어의 개수 N 개가 주어지면, 단어의 길이가 짧은 순으로, 단어의 길이가 같다면 사전 순으로 중복 없이 정렬하기
2. 입출력
// input
13
but
i
wont
hesitate
no
more
no
more
it
cannot
wait
im
yours
// output
i
im
it
no
but
more
wait
wont
yours
cannot
hesitate
3. 코드
import java.io.*;
import java.util.*;
public class b1181 {
public static void main(String[] args) throws NumberFormatException, IOException {
// System.setIn(new FileInputStream(new File("input.txt")));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine()); // 단어의 개수
String[] arr = new String[N]; // 단어를 저장할 배열
for (int i = 0; i < N; i++) {
arr[i] = br.readLine();
}
Arrays.sort(arr, new Comparator<String>() { // Comparator를 이용한 정렬
@Override
public int compare(String o1, String o2) {
if(o1.length() == o2.length()) // 단어의 길이가 같다면
return o1.compareTo(o2); // 사전순 정렬
return o1.length() - o2.length(); // 단어의 길이를 기준으로 정렬
}
});
Set<String> set = new HashSet<String>(); // 단어의 중복을 확인할 set 배열
for (int i = 0; i < arr.length; i++) {
if(set.add(arr[i])) { // set에 넣을 수 있다면(중복되지 않았다면)
sb.append(arr[i] + "\n"); // StringBuilder에 추가
}
}
System.out.println(sb.toString());
}
}
실행 결과
4. 회고
1) Array를 Comparator를 사용하여 정렬 조건을 부여함
2) 중복을 제거하기 위해서 Set에 넣을 수 있으면(add) true 값을 반환하는 성질을 이용하여 StringBuilder에 출력값을 저장함
5. Github
https://github.com/iihye/Algorithm/blob/main/Baekjoon/b1181.java
728x90