어제 그리디 알고리즘 문제를 풀다가 또 Comparator를 사용할 기회가 생겨서 사용해봤다! 그리고 오늘 또 비슷하게 Comparable이나 Comparator로 풀만한 문제가 있길래 둘 다 구현해서 제출해봤당ㅎㅎ 1은 Comparable로 구현을 한 것이고, 2는 Comparator로 구현한건데 미세하게 1이 더 빠르긴 해서.. Comparable로 구현하는게 더 빠른가? 하고 고민중

Algorithm : Comparator
Comparator
기본 정렬 기준(int/long 오름차순 정렬, String 사전순 정렬) 외에 다른 기준으로 정렬하고자 할 때 사용한다.
- compare 함수의 return 값이 양수라면 두 요소의 자리를 바꾼다.
- return 값이 0이나 음수라면 두 요소의 자리를 바꾸지 않는다.
- Comparable 때처럼 내림차순 정렬을 하고 싶다면 if-else 문을 사용한다.
ex) if(this.getElement() < cls.getElement()) return -1;
import java.Arrays;
import java.util.Comparator;
class ClassName {
// 멤버변수, 생성자, getter, putter 생략
}
public class Main() {
public static void mian(String[] args) {
ClassName[] cls = new ClassName[n];
Arrays.sort(cls, new Comparator<ClassName>() {
@Override
public int compare(ClassName c1, ClassName c2) {
return c1.getElement() - c2.getElement();
}
});
}
}
Comparator를 사용한 알고리즘 코드
출처 : 1181번: 단어 정렬 (acmicpc.net)
1181번: 단어 정렬
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
www.acmicpc.net
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Comparator;
class Words {
private String word;
private int length;
public Words (String word, int length) {
this.word = word;
this.length = length;
}
public String getWord() {
return this.word;
}
public int getLength() {
return this.length;
}
}
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
Words[] words = new Words[n];
for(int i = 0; i < n; i++) {
String w = br.readLine();
int l = w.length();
words[i] = new Words(w, l);
}
Arrays.sort(words, new Comparator<Words>() {
@Override
public int compare(Words w1, Words w2) {
if(w1.getLength() == w2.getLength()) {
return w1.getWord().compareTo(w2.getWord());
}
return w1.getLength() - w2.getLength();
}
});
ArrayList<String> list = new ArrayList<String>();
for(int i = 0; i < n; i++) {
if(!list.contains(words[i].getWord()))
list.add(words[i].getWord());
}
StringBuilder sb = new StringBuilder();
for(int i = 0; i < list.size(); i++) {
sb.append(list.get(i)).append("\n");
}
System.out.println(sb);
}
}
추가 코드
Comparater를 사용해 ArrayList의 Integer 요소 내림차순 정렬 코드
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
return b - a;
}
});
반응형
'Programando > Algorithm' 카테고리의 다른 글
스택과 JAVA Stack 클래스 (0) | 2021.06.09 |
---|---|
정렬: 좌표 압축 (0) | 2021.05.29 |
탐욕 알고리즘(Greedy Algorithm) (0) | 2021.05.26 |
정렬: Comparable (0) | 2021.05.26 |
JAVA 해시맵 사용과 정렬 알고리즘 (0) | 2021.05.25 |