https://www.acmicpc.net/problem/15975
코드설명
정렬(Sort)을 활용합니다.
문제에서 실수했던 점입니다.
1. 현재 저의 로직은, 앞의 것과 뒤의 것을 비교하여서 더 가까운 거리를 더해줍니다.
이떄, 맨 앞과 맨뒤는 각각 한가지 방향으로만 NODE가 존재합니다.
그러므로 맨 앞과 뒤는 따로 처리합니다.
이떄 N>=2 일때만 처리하는데, 처음에 뒷 부분 처리하는 함수에서 N > 2로 처리하여서 오류가 있었습니다.
직접 N에 2를 넣어보면, 오류가 나는 원인을 알 수 있습니다.
엣지케이스나 범위를 선정할시 유의해야합니다.
if(N >= 2) {
if(node[0].y == node[1].y) {
answer += Math.abs(node[1].x - node[0].x);
}
}
...
...
...
if(N >= 2) {
if(node[N-2].y == node[N-1].y) {
answer += Math.abs(node[N-2].x - node[N-1].x);
}
}
이 문제의 경우 일종 총 3개의 구간을 윈도우 더한다고 생각하면 이해하기 쉬워집니다.
코드
package Main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
private static int N, K, M, L;
private static int[] arr;
private static long answer = 0;
private static Node[] node;
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());
node = new Node[N];
for(int i=0;i<N;i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
node[i] = new Node(x, y);
}
Arrays.sort(node);
// for(Node v : node) {
// System.out.println(v.x + " "+v.y);
// }
if(N >= 2) {
if(node[0].y == node[1].y) {
answer += Math.abs(node[1].x - node[0].x);
}
}
for(int i=1;i<N-1;i++) {
Node beforeNode = node[i-1];
Node nextNode = node[i + 1];
Node nowNode = node[i];
long minDist = Long.MAX_VALUE;
//만약 같은 색깔이라면,
if(beforeNode.y == nowNode.y) {
minDist = Math.min(minDist, Math.abs(beforeNode.x - nowNode.x));
}
//만약 다음 좌표도 같은 색깔이라면,
if(nowNode.y == nextNode.y) {
minDist = Math.min(minDist, Math.abs(nextNode.x - nowNode.x));
}
//만약 값이 존재한다면, 더해줍니다.
if(minDist != Long.MAX_VALUE) answer += minDist;
}
if(N >= 2) {
if(node[N-2].y == node[N-1].y) {
answer += Math.abs(node[N-2].x - node[N-1].x);
}
}
System.out.println(answer);
}
private static class Node implements Comparable<Node>{
int x;
int y;
public Node(int x, int y) {
this.x=x;
this.y=y;
}
@Override
public int compareTo(Node other) {
if(this.y != other.y) {
return Integer.compare(this.y, other.y);
}
return Integer.compare(this.x, other.x);
}
}
}