
이번주는 저번주에 비하면 좀 수월하게 해결한 것 같다..
난이도도 실버라 많이 높진 않았고, 익숙한 개념인 정렬이라서 그랬던 것 같다.
우선, 데이터를 비교할 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에 저장해주고, 이를 한 번에 출력해주면서 해결하였다.

굿