중복 제거후, 단어의 길이로 먼저 정렬을 하고, 단어 길이가 같은 경우에는 사전순으로 정렬을 하면 되는 문제입니다. 자바로 custom하게 어떻게 정렬하는지 한참 찾아보고 풀었습니다.
import java.io.IOException;
import java.util.*;
class sortByValueFirst implements Comparator<String>{
@Override
public int compare(String o1, String o2) {
if(o1.length() > o2.length()) return 1;
else if(o1.length() < o2.length()) return -1;
else return o1.compareTo(o2);
}
}
public class Main {
public static void main(String[] args) throws IOException {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
HashSet<String> words = new HashSet<>();
for (int i = 0; i < n; i++)
words.add(input.next());
ArrayList<String> list = new ArrayList<>(words);
Collections.sort(list, new sortByValueFirst());
for (String s : list)
System.out.println(s);
}
}
우선 중복을 제거해야 하기 때문에 받는 입력을 HashMap
에 넣어서 중복 단어를 제거해줬습니다. 그러고 얘를 ArrayList
에 넣어주고, 요 놈을 정렬했슴니다
ArrayList
는 Collections.sort()
를 통해서 정렬이 가능합니다. 이 때 Collections.sort()
함수는 두 가지 형태에 대해서 오버라이딩이 되어 있습니다.
첫 번째 함수 형태는 하나의 인자 정보를 넘겨주는 형태로 ArrayList 객체를 넘겨줍니다. 이때 ArrayList에 담기는 요소의 Type 클래스에서 Comparable 인터페이스를 구현하여 compareTo() 함수를 오버라이딩 해주어야 합니다.
두 번째 함수 형태는 첫 번째 인자를 ArrayList 객체를 넘겨주게 되고 두 번째 인자는 Comparator 인터페이스를 implements한 후 compare() 함수를 오버라이딩한 구현체를 넘겨주게 됩니다.
Comparator Interface의 compare() 작성법
-
첫 번째 파라미터로 넘어온 객체 < 두 번째 파라미터로 넘어온 객체: 음수 리턴
-
첫 번째 파라미터로 넘어온 객체 == 두 번째 파라미터로 넘어온 객체: 0 리턴
-
첫 번째 파라미터로 넘어온 객체 > 두 번째 파라미터로 넘어온 객체: 양수 리턴
-
음수 또는 0이면 객체의 자리가 그대로 유지되며, 양수인 경우에는 두 객체의 자리가 변경됩니다. 즉,
Integer.compare(x, y)
(오름차순 정렬)와 동일한 개념입니다.
단어들의 길이가 다를 때 길이를 보고 정렬을 하고, 같을 때는 단어를 보고 정렬을 해주면 됩니다.
감사합ㄴㅣ다
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ-11726][DP] 2×n 타일링 - Java (0) | 2020.07.26 |
---|---|
[BOJ-1765][DFS] 닭싸움 팀 정하기 - Java (0) | 2020.07.21 |
[BOJ-1463][DP] 1로 만들기 - Java (2) | 2020.07.19 |
[BOJ-2667][BFS] 단지번호붙이기 - Java (0) | 2020.07.18 |
[BOJ-2178][BFS] 미로 탐색 - Java (0) | 2020.07.17 |