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);
    	}
    }
    
}

+ Recent posts