21.08.25 기록

1 분 소요

백준 알고리즘 11650 풀이

🎆나의 오답(시간초과)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class B11650 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        final int RANGE = 100_000;

        int N = Integer.parseInt(br.readLine());
        int[] countingX = new int[2*RANGE + 1];
        int[] y = new int[2*RANGE + 1];

        for(int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            int n = Integer.parseInt(st.nextToken()) + RANGE;
            int m = Integer.parseInt(st.nextToken()) + RANGE;
            countingX[n]++;
            y[m] = n;
        }

        StringBuilder sb = new StringBuilder();
        boolean[] check = new boolean[2*RANGE + 1];
        int cnt = 0;
        for(int i = 0; i < countingX.length; i++) {
            if(cnt == N) { break; }
            for(int j = 0; j < y.length; j++) {
                if(countingX[i] < 1) { break; }
                if(y[j] == i && !check[j]) {
                    cnt++;
                    sb.append(i-RANGE).append(" ").append(j-RANGE).append("\n");
                    check[j] = true;
                    countingX[i]--;
                }
            }
        }
        System.out.println(sb);
    }
}


🎆해설(메모리 50.5MB, 시간 784ms로 통과)

-Comparator 인터페이스를 람다 형태로 구현하여 Arrays.sort() 기능을 확장한 풀이다.

  • Comparable vs Comparator
  • Comparable은 ‘자기 자신과 매개변수 객체를 비교’ 하고, Comparator는 ‘두 매개변수 객체를 비교’ 한다.
  • 두 인터페이스의 메소드를 재정의 후, + 또는 -를 사용하여 값을 반환할 때 Overflow 또는 Underflow가 발생할 여지가 반드시 확인해야할 필요가 있다.
  • Comparator를 구현할 때 익명 객체를 사용하면 메소드를 사용하는 코드에 더 집중할 수 있다.
  • 자바는 기본적으로 오름차순 정렬을 하며, 두 수를 비교할 때 결과가 음수면 원소의 위치를 교환하지 않고 양수일 경우 위치를 교환한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class B11650 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        StringTokenizer st;
        int[][] numbers = new int[N][2];
        for(int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            numbers[i][0] =  Integer.parseInt(st.nextToken());
            numbers[i][1] =  Integer.parseInt(st.nextToken());
        }

        //sort(T[] a, Comparator<? super T> c) Comparator는 compare()를 구현해야한다.
        Arrays.sort(numbers, (e1, e2) -> {

            //return 값이 음수이면 요소의 위치를 바꾼다.
            if(e1[0] == e2[0]) { return e1[1] - e2[1]; }
            else { return e1[0] - e2[0]; }
        });

        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < N; i++) {
            sb.append(numbers[i][0]).append(" ").append(numbers[i][1]).append("\n");
        }
        System.out.println(sb);
    }
}

카테고리:

업데이트: