https://www.acmicpc.net/problem/1181
1181번: 단어 정렬
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
www.acmicpc.net
문제
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
입력
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
출력
조건에 따라 정렬하여 단어들을 출력한다. 단, 같은 단어가 여러 번 입력된 경우에는 한 번씩만 출력한다.
성공코드
// 2022.01.26.수
import java.io.*;
import java.util.*;
public class BOJ1181 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
HashSet<String> set = new HashSet();
for (int i = 0; i < N; i++) {
set.add(br.readLine());
}
List<String> list = new ArrayList(set);
Collections.sort(list);
for (int i = 1; i <= 50; i++) {
for (int j = 0; j < list.size(); j++) {
if (list.get(j).length() == i) {
bw.write(list.get(j) + "\n");
list.remove(j);
j--;
}
}
}
bw.flush();
}
}
Solution
단어가 중복되면 한 번씩만 출력되어야 하므로 HashSet을 만들어 입력받은 단어들을 저장한 다음 List를 만들어 옮긴 후 정렬했다. 그 후 이중for문을 만들어 길이가 1인 단어가 있는지 탐색하고 있다면 출력한 후 list에서 삭제하는 과정을 반복한다.
Review
이중for문 안에 리스트의 size가 0일 때 종료되는 조건을 넣었으면 더 효율적인 코드가 됐을 것 같다! 전에 틀렸던 문제 해결하기 성공ㅎ.ㅎ
'baekjoon(Java)' 카테고리의 다른 글
[BOJ] 백준 7568 덩치 (Java) (0) | 2022.02.10 |
---|---|
[BOJ] 백준 1920 수 찾기 (Java) (0) | 2022.02.03 |
[BOJ] 백준 10816 숫자 카드 2 (Java) (0) | 2022.01.22 |
[BOJ] 백준 1312 소수 (Java) (0) | 2022.01.20 |
[BOJ] 백준 1158 요세푸스 문제 (Java) (0) | 2022.01.17 |
댓글