https://www.acmicpc.net/problem/1181
[문제]
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
[입력 조건]
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
[코드]
import java.util.*;
public class BaekJoon_1181 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
String[] arr=new String[n];
/* nextInt() 로 정수를 입력받은 뒤, nextLine() 을 쓰면 입력한 첫 번째 문자가
* arr[0] 에 입력되는 것이 아니라 개행("\n")이 arr[0] 에 저장된다.
* 따라서 개행을 버리는 과정을 거쳐야 한다.
*/
sc.nextLine();
for(int i=0;i<n;i++) arr[i]=sc.nextLine();
Arrays.sort(arr, new Comparator<String>() {
@Override
/* 기본적으로 compare 메소드는 3가지 리턴 값(양의 정수, 0, 음의정수)에 의해 위치를 바꿀지 결정하게 된다
* 양의 정수일 경우에만 위치를 바꾸고 0이나 음수 정수인 경우에는 바꾸지 않는다
* 따라서 compare 메소드 리턴 타입은 int 형이 된다.
*/
public int compare(String s1, String s2) {
if(s1.length()>s2.length()) return 1;
else if(s1.length()<s2.length()) return -1;
else return s1.compareTo(s2);
}
});
System.out.println(arr[0]);
/*
* 아래 if문에서 arr[i]와 arr[i-1]을 비교하기 위해서는 i가 0부터 시작하면
* 배열 범위가 벗어나는 오류가 발생하기 때문에 사전에 arr[0]은 출력하고
* i를 1부터 해서 바교하여 출력한다.
* */
for(int i=1;i<n;i++) {
if(!arr[i].equals(arr[i-1])) System.out.println(arr[i]);
}
}
}
[고찰]
이번 문제 또한 앞선 문제와 같이 Comparator 인터페이스를 사용하면 쉽게 해결되는 문제였다. 다만 중복되는 값은 하나만 출력하는 조건 때문에 for문의 반복 조건을 설정하는데 시행착오가 있었다.
'백준' 카테고리의 다른 글
[백준_18870번] 좌표 압축하기 (0) | 2021.06.20 |
---|---|
[백준_10814번] 나이순 정렬 (0) | 2021.06.20 |
[백준_11650번] 좌표 정렬하기 (0) | 2021.06.20 |
[백준_1427번] 소트인사이드 (0) | 2021.06.20 |
[백준_2108번] 통계학 (0) | 2021.06.20 |