[문제풀이] 06-07. 좌표 정렬

𝒄𝒉𝒂𝒏𝒎𝒊𝒏·2023년 11월 5일
0

인프런, 자바(Java) 알고리즘 문제풀이

Sorting and Searching - 0607. 좌표 정렬


🗒️ 문제


🎈 나의 풀이

	public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr = new int[n];
        int multi = 100000;

        for(int i=0; i<n; i++) {
            int x = sc.nextInt();
            int y = sc.nextInt();

            arr[i] = x*multi + y;
        }

        Arrays.sort(arr);

        for(int i=0; i<n; i++) {
            System.out.println(arr[i]/multi + " " + arr[i]%multi);
        }
    }


🖍️ 강의 풀이

  class Point implements Comparable<Point>{
	public int x, y;
	Point(int x, int y){
		this.x=x;
		this.y=y;
	}
	@Override
	public int compareTo(Point o){
		if(this.x==o.x) return this.y-o.y;
		else return this.x-o.x;
	}
}

class Main {	
	public static void main(String[] args){
		Scanner kb = new Scanner(System.in);
		int n=kb.nextInt();
		ArrayList<Point> arr=new ArrayList<>();
		for(int i=0; i<n; i++){
			int x=kb.nextInt();
			int y=kb.nextInt();
			arr.add(new Point(x, y));
		}
		Collections.sort(arr);
		for(Point o : arr) System.out.println(o.x+" "+o.y);
	}
}


💬 짚어가기

해당 문제는 Comparable<> 인터페이스를 이용해 풀 수 있다. 나의 풀이에서는 정석이 아닌
일종의 꼼수로 문제를 풀었다. x좌표에 10만을 곱하고 y좌표와 더한 후 정렬하여 출력한다.
테스트 케이스의 좌표 영역이 10만보다 커지는 경우 문제가 발생할 것이다.

강의에서는 Point라는 클래스를 만들어 x좌표y좌표를 저장할 수 있는 인스턴스 변수를
생성하고 Comparable 인터페이스를 상속받아 compareTo() 메소드를 구현하였다.

comapreTo() 메소드는 인터페이스의 메소드를 재정의 한 것이기 때문에 위에 @Override
어노테이션이 붙은 것을 확인 할 수 있다. 이는 Collections.sort() 정렬에 이용된다.

compareTo()메소드의 리턴값

  • 오름차순 정렬 : return 음수 값
  • 내림차순 정렬 : return 양수 값

해당 문제에서는 좌표를 오름차순 정렬해야한다. 따라서 comaplreTo() 메소드에는 파라미터로
받은 Point객체 Ox, y 값과 비교하여 음수를 반환하도록 한다.

@Override
	public int compareTo(Point o){
    	// x 좌표가 같은 경우 y 좌표를 비교한다.
		if(this.x==o.x) return this.y-o.y;
        // x 좌표가 다른 경우 x 좌표를 비교한다.
		else return this.x-o.x;
	}
profile
𝑶𝒏𝒆 𝒅𝒂𝒚 𝒐𝒓 𝒅𝒂𝒚 𝒐𝒏𝒆.

0개의 댓글