SWEA 8382 - 방향 전환

Updated:

Java

8382 번 - 방향 전환

문제

(x1, y1 )에서 (x2, y2)로 이동하려고 한다.

(x, y)에서 한 번 이동하면 (x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)로 이동할 수 있다.

이 중에서, (x + 1, y), (x - 1, y)로 이동하는 것은 가로 이동, (x, y + 1), (x , y - 1)로 이동하는 것은 세로 이동이라고 한다.

정우는 그냥 (x1, y1)에서 (x2, y2)로 이동하는 것은 재미가 없다고 생각한다.

그래서 이전 이동이 가로 이동이었다면, 이번에는 세로 이동으로 이동하고, 이전 이동이 세로 이동이었다면, 이번에는 가로 이동으로 이동하여 (x1, y1)에서 (x2, y2)로 이동하려고 한다.

가장 첫 이동은 어떤 이동 이어도 상관 없다.

이 때, 최소 몇 번의 이동을 해야 (x1, y1)에서 (x2, y2)로 이동할 수 있는지 구하는 프로그램을 작성하라.

접근 방법

시작점에서 끝점까지 일직선으로 가지 못하고, [가로 -> 세로] 혹은 [세로 -> 가로]로만 가야한다.
즉 대각선으로 이동 한다고 생각하고 해결하였다.

먼저, x좌표와 y좌표끼리의 차이를 구하여 세로의 길이와 가로의 길이를 구한다.

세로의 거리와 가로의 거리 중, 짧은 거리 만큼 먼저 대각선으로 이동한다.
이동한 대각선의 위치에서 목표하는 점까지 나머지 거리를 이동하도록 하는데, 대각선으로 이동하므로 x 2를 해준다.

만약 홀수이면 1만큼 덜 가도 목적지에 도달 할 수 있다.

코드

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

class Solution {
	static int result = 0, ty, tx;
	public static void main(String []args) throws Exception {  
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	StringTokenizer stk;
    	int tc = stoi(br.readLine());
    	
    	for(int tidx = 1; tidx <= tc; tidx++) {
    		result = 0;
    		stk = new StringTokenizer(br.readLine());
    		int y1 = stoi(stk.nextToken());
    		int x1 = stoi(stk.nextToken());
    		int y2 = stoi(stk.nextToken());
    		int x2 = stoi(stk.nextToken());
    		
    		int row = Math.abs(y1 - y2);	// 세로 길이
    		int col = Math.abs(x1 - x2);	// 가로 길이
    		
    		int max = Math.max(row, col);	
    		int min = Math.min(row, col);	// 세로길이와 가로길이 중 더 짧은 거리만큼 대각선으로 이동
    		int diff = max - min;			// 대각선으로 이동 후 남은 거리를 구한다.
    		
    		result = 2 * min + 2 * diff - (diff % 2);		// 남은 거리가 홀수면 1을 빼준다.
    		
    		System.out.println("#" + tidx + " " + result);
    	}	
	}
	
	static int stoi(String str) {
    	return Integer.parseInt(str);
    }
}

총평

후기

수학으로 접근해야 하는 문제는..

개선할 점