본문 바로가기

알고리즘 문제풀이/백준

[BOJ][JAVA] 1181 - 단어 정렬

문제 출처 : https://www.acmicpc.net/problem/1181

 

1181번: 단어 정렬

첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.

www.acmicpc.net

 

 

 

 

문제

 

설명

Comparator와 contains함수를 잘 활용해서 풀어야 하는 문제입니다.

인터넷의 다른 포스팅들도 대부분 풀이가 같은 걸로 보아, 이 풀이로 거의 정형화된 문제인 것 같습니다.

 

compare(o1, o2)와 o1.compareTo(o2)는 공통적으로 o1에서 o2를 빼는데, 오버라이딩을 통해 연산의 대상을 변경할 수  있습니다. 그리고 이 두 함수는 연산의 결과값이 양수일 때만 o1과 o2의 위치를 바꾼다는 사실을 잘 활용해서 풀면 됩니다. (o1이 더 작은 대상이고, o2가 더 큰 대상이라고 생각하면 편합니다!)

 

 

 

코드

 

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

public class BOJ_1181 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();
		
		
		String[] arr = new String[num];
		for (int i = 0; i < num; i++) {
			arr[i]=sc.next();
		}
		sc.close();
		//입력 완료
		
		
		Arrays.sort(arr, new Comparator<String>() {

			@Override
			public int compare(String o1, String o2) {
				
				if(o1.length()==o2.length())
					return o1.compareTo(o2); //ex) am - at = 음수 -> 순서 바꾸지 않으므로 'am at' 순서 그대로 유지됨.(사전순 정렬)
				else
					return o1.length()-o2.length(); //길이 기준으로 오름차순 정렬
			}
		});
		//정렬된 array 완성
		
		//중복값 제외하고 차례대로 넣음
		List<String> result = new ArrayList<>();
		
		for(String str : arr) {
			if(!result.contains(str))
				result.add(str);
		}
		
		for(String s: result)
			System.out.println(s);
		
		
	}
}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[BOJ][JAVA] 10773 - 제로  (0) 2021.09.22
[BOJ][JAVA] 7568 - 덩치  (0) 2021.09.21
[BOJ][JAVA] 9012 - 괄호  (0) 2021.09.21
[BOJ][JAVA] 1120 - 문자열  (0) 2021.09.18
[BOJ][JAVA] 2920 - 음계  (0) 2021.09.18