프로그래머스 백준 문제

자바 CompareTo 와 Compare 비교 및 차이(1181번,11650번)

전한준 2025. 6. 21. 16:51

자바에서 

 

Comparator와 Comparable은 서로 

객체를 비교하기 위해서 사용을하는 것이다.

 

 

Comparable 은 CompareTo를 반환하는데 이거는 자기 자신과 상대방을 비교하는 것이다.

Comparator는 compare이라는 매서드가 있는데 이것은 두 객체끼리 비교를 하는 것이다.

 

Comparable과 Comparator 모두 원시타입 byte, char, double, short, long, int, float 는 적용이 안되고 

Integer,String 과 같은 Wrapper 클래스만 적용이 가능하다. 

 

 

Comparator의  compare 숫자와 문자열 정렬 

import java.util.Arrays;
import java.util.Comparator;
public class Main {
    public static void main(String[] args) {
    	// Integer 배열 선언
        Integer[] int_arr = {100, 99, 80, 60 ,50, 101};
        Arrays.sort(int_arr, new iComparator());

        for (int i = 0; i < int_arr.length; i++)
            System.out.print(int_arr[i]+ " ");
        System.out.println();
        
        // String 배열 선언
        String[] s_arr = {"z", "a", "v", "s", "b", "m"};
        Arrays.sort(s_arr, new sComparator());


        for (int i = 0; i < s_arr.length; i++)
            System.out.print(s_arr[i]+ " ");
        System.out.println();
        
    }
    
    public static class iComparator implements Comparator<Integer> {
        @Override
        public int compare(Integer o1, Integer o2) {
            return o2 - o1;
        }
    }
    
    public static class sComparator implements Comparator<String> {
        @Override
        public int compare(String o1, String o2) {
            return o2.compareTo(o1);
        }
    }
}

 

보통 파라미터에서 앞에서 선언된 변수와 뒤에서 선언된 변수끼리 뺏을 경우 음수가 나온다.(아스키 코드라면)

그러면 이거는 오름차순으로 정리가 된다. 

 

 

1181번 

import java.io.*;
import java.util.*;

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());
        String []s=new String[n];
        
    for(int i=0;i<n;i++){
        s[i]=br.readLine();
    }

    Arrays.sort(s,new sComparator());

    for(int i=1;i<s.length;i++){
        if(!s[i-1]===(s[i])){
            System.out.println(s[i]);
        }
    }
    // Arrays.sort는 Wrapper Class 만 가능핟. 
    }

    public static class sComparator implements Comparator<String>{
        @Override
        public int compare(String o1,String o2){
            if(o1.length()==o2.length()){
                return o1.compareTo(o2);
            }
            return o1.length()-o2.length();
        }
    }
    
}

 

 

11650 (클래스 배열을 통한 내부에서 정의가 가능하다. )

import java.util.*;
import java.io.*;

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        DOT[] d = new DOT[n];
        
        for (int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());
            d[i] = new DOT(x, y);
        }

        // 정렬: x 오름차순, 같으면 y 오름차순
        Arrays.sort(d, new Comparator<DOT>() {
            @Override
            public int compare(DOT o1, DOT o2) {
                if (o1.x == o2.x) {
                    return o1.y - o2.y;
                }
                return o1.x - o2.x;
            }
        });

        for (int i = 0; i < d.length; i++) {
            System.out.println(d[i].x + " " + d[i].y);
        }
    }

    public static class DOT {
        int x, y;
        DOT(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
}

'프로그래머스 백준 문제' 카테고리의 다른 글

12015 번 가장 긴 증가하는 부분 수열2  (0) 2025.07.16
3986 좋은 단어  (0) 2025.07.14
9935번 문자열 폭발  (2) 2025.06.19
백준 1920  (0) 2025.06.16
백준 10816 숫자카드2  (0) 2025.06.16