https://www.acmicpc.net/problem/1181
1181번: 단어 정렬
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
www.acmicpc.net
문제
풀이
자바에서는 객체 비교하는 `Comparator` 클래스가 있다.
사용법은 `Comparator` 클래스를 생성하여 내부에 `compare`메서드를 원하는 정렬 기준대로 구현하여 사용한다.
`compare` 메서드는 파라미터를 빼주어 값이 0이거나 음수면 자리바꿈을 하지 않고 양수면 자리바꿈을 수행하는 메서드이다.
리턴 값은 아래 3가지이다.
- 양의 정수 : 자리바꿈
- 0 : 자리안바꿈
- 음의 정수 : 자리안바꿈
예를 들자면, {3,2,5} 배열이 있다. 3-2를 할경우 양의 정수이므로 자리를 바꿔준다. 하지만 2-5 일경우는 음의 정수이므로 자리를 안바꿔준다. 이처럼 정렬을 해주는 메소드이다.
보통
- Arrays.sort()
- Collections.sort()
와 같이 쓰인다.
이제 문제를 풀어보자.
조건을 보면 단어 길이가 같을 경우 '사전순'으로 정렬해야한다.
따라서 1차적으로 단어 길이를 통해 정렬을 하고 같은 길이면 사전순으로 정렬을 해야한다.
단어 사전순 정렬은 `compareTo` 메서드를 쓰면 된다.
또 다른 조건은 같은 단어를 여러 번 입력하면 한번만 출력되도록 해야한다.
따라서 for문을 돌면서 앞뒤로 같은 문자(equals)가 아닌 것만 출력하도록 하였다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
public class BOJ1181 {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int num = Integer.parseInt(br.readLine());
String []input = new String[num];
for(int i=0;i<num;i++) {
input[i] = br.readLine();
}
Arrays.sort(input, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
if(s1.length() == s2.length()) {
return s1.compareTo(s2);
}else {
return s1.length() - s2.length();
}
}
});
sb.append(input[0]+"\n");
for(int i=1;i<num;i++) {
if(!input[i].equals(input[i-1])){
sb.append(input[i]+"\n");
}
}
System.out.println(sb);
}
}
'코딩테스트' 카테고리의 다른 글
[BOJ_9093/JAVA] 단어뒤집기 (0) | 2021.12.16 |
---|---|
[BOJ_17413/JAVA] 단어뒤집기2 (0) | 2021.12.16 |
[BOJ_4344/JAVA] 평균은 넘겠지 (0) | 2021.12.15 |
[BOJ_1406/JAVA] 에디터 (0) | 2021.12.15 |
[BOJ_1874/JAVA] 스택 수열 (0) | 2021.12.14 |