백준 자바 11650 좌표 정렬하기

김재동·2024년 7월 15일
1

문제

목록 보기
7/16

이번주는 저번주에 비하면 좀 수월하게 해결한 것 같다..
난이도도 실버라 많이 높진 않았고, 익숙한 개념인 정렬이라서 그랬던 것 같다.
우선, 데이터를 비교할 n을 받고, 이후 n 번의 데이터를 다 받은 후
정렬하면 되는 문제이다.

package test12;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Ox12_Q1_1 {
	// 백준 11650 S5 좌표 정렬하기
	public static void main(String [] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		StringBuilder sb = new StringBuilder();
		StringTokenizer st;
		
		// 우선순위 큐 선언
		PriorityQueue<Dot> dotPrQ= new PriorityQueue<>(1, new dotComparator());
		for(int i = 0; i<n; i++) {
			st = new StringTokenizer(br.readLine());
			int dot1 = Integer.parseInt(st.nextToken());
			int dot2 = Integer.parseInt(st.nextToken());
			dotPrQ.offer(new Dot(dot1,dot2));
		}
		br.close();
		
		while(!dotPrQ.isEmpty()) {
			Dot d = dotPrQ.poll();
			sb.append(d.dot1).append(" ").append(d.dot2).append("\n");
		}
		System.out.println(sb.toString());

	}

}

class Dot{
	int dot1;
	int dot2;
	public Dot(int dot1, int dot2) {
		this.dot1 = dot1;
		this.dot2 = dot2;
	}
}

//클래스 객체의 우선순위를 위한 클래스
class dotComparator implements Comparator<Dot>{
	@Override
	public int compare(Dot d1, Dot d2) {
		if(d1.dot1 == d2.dot1) {
			return d1.dot2 - d2.dot2;
		}else {
			return d1.dot1 - d2.dot1;
		}
	}
}

우선 이 과정에서 우선순위 큐를 활용하고 싶었는데,
아직 미숙하여 공부할 겸 다른 분들의 코드를 인용하여 사용하였다.

먼저 n을 받은 후, n번 반복하여 데이터 dot1, dot2를 반복하여
dotPrQ (우선순위 큐) 에 저장한다.

우선순위 큐 같은 경우 데이터를 입력하거나 출력할 때 힙 영역에서 정렬되고,
정렬하기 위한 방식을 Comparator를 상속받아 설정할 수 있다.

먼저, dot1과 dot2를 한 번에 비교해야하므로 두 값을 객체화 해서 Dot로 묶어주었고, 이 값을 비교해주는 메소드를 생성해주었다.
여기서 우리가 원하는 정렬 방식인, dot1의 값이 서로 같으면 dot2를 기준으로 작은 값이 나오고, 만약 다르면 더 작은 값이 우선해서 나오도록 정렬하는 구문을 작성해주었다.

이후 아까 저장했던 dotPrQ에서 값을 하나씩 빼면서 원하는 값들을 sb에 저장해주고, 이를 한 번에 출력해주면서 해결하였다.


굿

profile
성장중

0개의 댓글