hye-log

[백준]1181번 단어 정렬(JAVA) 본문

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
Comments