본문 바로가기
Programando/Algorithm

정렬: Comparator

어제 그리디 알고리즘 문제를 풀다가 또 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