알고리즘/백준 문제풀이

백준 [자바 java] 10655번 : 마라톤

잔디🌿 2025. 6. 24. 01:09

https://www.acmicpc.net/problem/10655

이 문제는 딱 봤을 때 브루트포스 문제임을 알 수 있었다. 

그런데 단순히 처음부터 끝까지 매번 계산하는 것 보다 누적합을 쓰는 것이 더욱 효율적이라는 생각이 들어 그렇게 풀었다.

 

for(int i = 0;i<n;i++){
  st = new StringTokenizer(br.readLine());
  arr[i][0] = Integer.parseInt(st.nextToken());
  arr[i][1] = Integer.parseInt(st.nextToken());
}

먼저 각 좌표의 값을 입력받는다.

 

for(int i = 1;i<n;i++){
  int now = Math.abs(arr[i][0] - arr[i-1][0]) + Math.abs(arr[i][1] - arr[i-1][1]);
  nu[i] = nu[i-1] + now;
}

그 다음 누적합 배열을 생성한다. 

now는 현재 노드와 이전 노드의 거리를 뜻한다. 거리는 절댓값을 사용해야하니까 Math 라이브러리의 abs를 사용하였다.

 

이 값을 누적합 배열의 이전 값과 더한다.

 

int ans = Integer.MAX_VALUE;

for(int i = 1;i<n-1;i++){
  int dis = nu[i-1] + (nu[n-1] - nu[i+1]) + Math.abs(arr[i-1][0] - arr[i+1][0]) + Math.abs(arr[i-1][1] - arr[i+1][1]);
  if(dis < ans) ans = dis;
}

ans는 가장 작은 값이 되어야하므로, 초기값은 가장 큰 값으로 잡는다.

그 다음 각 노드를 건너 뛸 때마다의 거리를 측정한다.

만약, i번째 노드를 건너뛴다면, 누적합의 i-1 노드 값(해당 노드 전까지 이동하는데 걸리는 거리) + 누적합 가장 끝 값에서 누적합 i+1번째 노드 값을 뺀 값( 해당 노드 후에서 도착지점까지의 거리)를 한 후

i-1노드에서 i+1 노드까지의 거리를 구해 더한다.

 

import java.io.*;
import java.util.*;
import java.math.*;


public class Main {

  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int n = Integer.parseInt(br.readLine());

    StringTokenizer st;

    int[][] arr = new int[n][2];
    int[] nu = new int[n];

    for(int i = 0;i<n;i++){
      st = new StringTokenizer(br.readLine());
      arr[i][0] = Integer.parseInt(st.nextToken());
      arr[i][1] = Integer.parseInt(st.nextToken());
    }

    for(int i = 1;i<n;i++){
      int now = Math.abs(arr[i][0] - arr[i-1][0]) + Math.abs(arr[i][1] - arr[i-1][1]);
      nu[i] = nu[i-1] + now;
    }

    int ans = Integer.MAX_VALUE;

    for(int i = 1;i<n-1;i++){
      int dis = nu[i-1] + (nu[n-1] - nu[i+1]) + Math.abs(arr[i-1][0] - arr[i+1][0]) + Math.abs(arr[i-1][1] - arr[i+1][1]);
      if(dis < ans) ans = dis;
    }

    System.out.println(ans);

  }
}