Study/Problem Solving
[BOJ_22942] 데이터 체커
monitor
2023. 11. 4. 16:18
설명
내가 짠 코드이지만 찝찝하다.
4
5 4
3 1
6 1
9 1
입력시 사실 NO가 나와야하는데 YES가 나오는 코드이다.
지금 들어오는 첫번째의 케이스와 마지막 케이스가 접점이 존재하는데 맞았다는 케이스로 뜨게 된다.
내가 생각을 잘 못하고 있는건지 잘 파악이 되지 않아서 공유한다. 아래 코드는 PriorityQueue 즉 최소힙을 활용하였고 Comparable로 맨 앞에 스타팅 지점 기준으로 오름차순 정렬하였다.
코드
package Data_Structure;
import java.util.*;
import java.io.*;
public class BOJ_22942 {
static class Data implements Comparable<Data>{
int start;
int end;
int r;
public Data(int start, int end, int r){
this.start = start;
this.end = end;
this.r = r;
}
@Override
public int compareTo(Data o) {
return Integer.compare(this.start, o.start); //끝 지점끼리 비교
}
}
public static void main(String[] args) throws Exception{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer tk = new StringTokenizer(in.readLine()," ");
int N = Integer.parseInt(tk.nextToken());
PriorityQueue<Data> pq = new PriorityQueue<>();
for(int i = 0; i < N; i++){
tk = new StringTokenizer(in.readLine()," ");
int x = Integer.parseInt(tk.nextToken());
int r = Integer.parseInt(tk.nextToken());
pq.add(new Data((x - r),(x + r),r));
}
for(int i = 0; i < N; i++){
Data now = pq.poll();
int now_d = now.start + now.r;
if(pq.isEmpty()){
System.out.println("YES");
break;
}else {
int d = Math.abs((pq.peek().r + pq.peek().start) - now_d);
if(now.r + pq.peek().r < d){
continue;
}
else if(Math.abs(now.r - pq.peek().r) > d){
continue;
}else if(d == now.r + pq.peek().r || d == Math.abs(now.r - pq.peek().r)){
System.out.println("NO");
break;
}else{
System.out.println("NO");
break;
}
}
}
}
}
22942번: 데이터 체커
데이터가 조건에 맞는다면 YES, 조건에 만족하지 않는다면 NO를 출력한다.
www.acmicpc.net