본문 바로가기

문제 풀이/SW expert academy

[SWEA] D4 8382번 방향 전환 (JAVA)

문제 출처 - SW Expert Academy

문제는 여기

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

[문제] 

(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)로 이동할 수 있는지 구하는 프로그램을 작성하라.

[입력]

첫 번째 줄에 테스트 케이스의 수 T가 주어진다.
각 테스트 케이스의 첫 번째 줄에는 네 정수 x1, y1, x2, y2 (-100 ≤ x1, y1, x2, y2 ≤ 100)이 공백 하나로 구분되어 주어진다.

[출력]

각 테스트 케이스마다 ‘#x’(x는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력하고,
각 테스트 케이스마다 최소 몇 번의 이동을 해야 하는지 출력한다.

 

 


[풀이]

1. 첫 번째의 좌표와 두 번째의 좌표를 0,0을 기준으로 위치를 바꾼다.

2. 해당 좌표를 가기 위해서는 군을 구해준다.

3. 군으로부터 떨어진 x와 y의 값을 더해주고, 군 * 2를 더해준다.

[접근]

1. 이동시킨 좌표에서 계산을 하는 것보다 0, 0을 기준으로 하는 것이 더 쉽지 않을까?라고 생각

2. x, y지점을 가기 위해선 해당 군을 무조건 지나야 한다.

3. 수식을 이용해 이동거리를 계산해준다.(군 ~ x의 거리 + 군 ~ y의 거리 + 2 * 군)

[코드]

package swet;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Solution_D4_8382 {
	static int T;
	static int x1, y1;
	static int x2, y2;
	static int X, Y;
	static int goon;
	static int move;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		T = Integer.parseInt(br.readLine());
		
		for (int t = 1; t <= T; t++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			
			// 값 입력
			x1 = Integer.parseInt(st.nextToken());
			y1 = Integer.parseInt(st.nextToken());
			x2 = Integer.parseInt(st.nextToken());
			y2 = Integer.parseInt(st.nextToken());

			// 0,0을 기준으로 위치를 설정
			X = Math.abs(x2 - x1);
			Y = Math.abs(y2 - y1);
			
			goon = (X + Y) / 2;
			move = Math.abs(X - goon) + Math.abs(Y - goon) + 2 * goon;
			// 군으로부터 떨어진 x거리와 y거리의 합 + 군 (1,1일때 2군 == 군은 * 2)
			
			System.out.println("#" + t + " " + move);
		}
	}
}