P11651: 좌표 정렬하기2

wnajsldkf·2022년 12월 13일
0

Algorithm

목록 보기
16/58
post-thumbnail

설명

  • y좌표가 증가하는 순으로 정렬하고, y좌표가 같으면 x좌표가 증가하는 순서로 정렬한다.

본인의 풀이 방식은 x, y 좌표를 나타내는 Coord 클래스를 생성하고, compareTo 메서드를 오버라이드하여 비교하는 메서드를 작성하였다. 찾아보니 클래스가 아닌 2차원 배열로 x, y 좌표를 저장하는 방법도 있어 이 방법도 함께 소개하려고 한다.
출처:
https://st-lab.tistory.com/110
https://st-lab.tistory.com/111

코드

class 사용한 예시

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;

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

        N = Integer.parseInt(st.nextToken());   // 길이

        ArrayList<Coord> coordList = new ArrayList<>();

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            coordList.add(new Coord(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())));
        }
        Collections.sort(coordList);

        for (int i = 0; i < N; i++) {
            System.out.println(coordList.get(i));
        }
    }
}

class Coord implements Comparable<Coord>{
    private int x;
    private int y;

    Coord(int x, int y) {
        this.x = x;
        this.y = y;
    }

    @Override
    public int compareTo(Coord o) {
    	// 순서를 바꾼다.
        if (o.y > y) {
            return -1;
        }
        // 순서를 바꾼다.
        if (o.y == y && o.x > x) {
            return -1;
        }
        // 순서를 바꾸지 않는다.
        return 1;
    }

    @Override
    public String toString() {
        return x + " " + y;
    }
}

2차원 배열을 사용할 수도 있다.
sort 메서드는 제너릭 객체배열(T[]) 인자를 받을 수 있다. 이는 클래스, 오브젝트, 자료형 등 어떤 타입이든 배열 형태로 받을 수 있다.
int[][]int[] 하나의 타입이고, int[][] 라는 1차원 배열이라고 생각할 수 있다.
Comparator<? super T>c를 살펴보면, <? super T>라는 상속관계에 있는 타입만 자료형으로 받는다는 의미이다. T 타입이 자식클래스이고, T의 상속관계에 있는 타입까지 허용한다. 상속관계에 있는 데이터를 정렬하지 않아 <T>로만 봐도 된다. 우리는 compare 메서드를 오버라이딩하여 사용자화할 수 있다.

int[][] arr = new int[N][2];

for(int i = 0; i < N; i++){
	arr[i][1] = in.nextInt();
    arr[i][0] = in.nextInt();

2차원 배열 arr[N][2]배열에서, arr[i][0]arr[i+1][0]을 정렬하고, 두 값이 같으면 arr[i][1]arr[i+1][1]을 비교한다.

Arrays.sort(arr, (e1, e2) -> {
	// 첫번째 원소가 같다면, 두번째 원소끼리 비교한다.
	if(e1[0] == e2[0]){
    	return e1[1] - e2[1];
    } else {
    	return e1[0] - e2[0];
    }
});    
profile
https://mywnajsldkf.tistory.com -> 이사 중

0개의 댓글