백준 10655번 java 풀이
처음 생각한 풀이)
1. split으로 배열에 넣기
2. (|x1-x2|+|y1-y2|) 로 전체 거리 구하기
3. 전체 거리 합에서 2 제외한 값/
'' 3 제외한 값
:
'' N-1 제외한 값 구하기
4. min 값 구하기
오류)
1. 풀이1)split 배열에 넣고 for 문을 돌리면 전체 합/ 전체 차 같은건 구할수 있어도 (x2,y2), (x3,y3) 같은 개별 값을 따로 구할수 없다는걸 알고는 있었음. 각각의 값을 어떻게 구할지 해결하지 못함.
2. 풀이 3) 전체 거리에서 각좌표 제외한 값을 구하고 거기에 제외한값-1 에서 제외한값+1 사이 거리를 더하는걸 빼먹음
* ) 예전에는 풀이를 코딩으로 바꾸는 과정 자체를 아예 하지못했는데 쉬운 문제부터 풀다보니 이런 과정은 어느정도 할수있는 수준까지 발전을 함. 하지만 아직 중간 과정을 빼먹거나 코딩 구현하는데 적절한 함수를 생각해내지 못함.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N;
static int[][] checkPoint;
static int distance ;
static int min = Integer.MAX_VALUE;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st ;
N = Integer.parseInt(br.readLine());
checkPoint = new int[N][2];
// 초기값 출발 값
for(int i = 0 ; i < N ; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
checkPoint[i][0] = x;
checkPoint[i][1] = y;
if(i >= 1) {
distance += Math.abs(checkPoint[i][0] - checkPoint[i-1][0]) +Math.abs(checkPoint[i][1] - checkPoint[i-1][1]);
}
}
for(int i = 1; i < N-1 ; i++) {
// jump뛰는 시점
int original = Math.abs(checkPoint[i][0]-checkPoint[i-1][0])
+ Math.abs(checkPoint[i][1]-checkPoint[i-1][1])
+ Math.abs(checkPoint[i][0]-checkPoint[i+1][0])
+ Math.abs(checkPoint[i][1]-checkPoint[i+1][1]);
int jump = Math.abs(checkPoint[i-1][0] - checkPoint[i+1][0])
+ Math.abs(checkPoint[i-1][1] - checkPoint[i+1][1]);
min = Math.min(min, distance - original + jump);
}
System.out.println(min);
}
}
[Java/자바 백준 10655] 마라톤 1
풀이 실버 3 문제이지만 체감상 좀 더 어려워서 풀이를 남겨봅니당 ! 처음 이중 포문으로 브루트포스로 아주 간단히 풀려다가 시간 초과가 났습니다. 이후 어떤식으로 풀 수 있을까 생각하다가
kwangkyun-world.tistory.com
풀이 참고했습니다
중요 포인트)
2차원 배열, Math.abs(), Math.min(), min 값 구하기 위해 초기값 max 로 설정, for문에 Math.min() 넣고 돌리기.