Algorithm/SWEA 알고리즘

SWEA_8382 방향 전환(자바)

미스터로즈 2021. 4. 22. 08:53

문제 링크

 

SW Expert Academy

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

swexpertacademy.com

 

- 이 문제를 간단하게 이야기해보면, 두 좌표가 주어지고, 첫 좌표가 두번째 좌표까지 이동하는데 걸리는 이동횟수를 구하는 문제이다.

 

- 단순히 이동만 하면 좋은데 이동하는 방법은 세로로 한칸 가로로 한칸 을 반복하며 이동을 해야 한다.

 

- 이 문제에 대한 해결은 규칙을 찾아서 점화식을 이용해서 문제를 풀었습니다.

 

package com.Expert;

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

public class Expert_8382 {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb =new StringBuilder();
		StringTokenizer st;
		int testCase = Integer.parseInt(br.readLine());
		for (int tc = 1; tc <= testCase; tc++) {
			st = new StringTokenizer(br.readLine());
			int startX = Integer.parseInt(st.nextToken());
			int startY = Integer.parseInt(st.nextToken());
			int endX = Integer.parseInt(st.nextToken());
			int endY = Integer.parseInt(st.nextToken());
			int ans =0;
			
			int difX = Math.abs(startX-endX);
			int difY = Math.abs(startY-endY);			
			
			if(difX<difY) {
				int temp = difX;
				difX = difY;
				difY = temp;
			}
			
			ans+=difY*2;
			if(difX==difY) {
				sb.append("#"+tc+" "+ans+"\n");
				continue;
			}
			
			if((difX-difY)%2==0) {
				ans+=2*(difX-difY);
			}else {
				ans+=2*(difX-difY)-1;
			}
			sb.append("#"+tc+" "+ans+"\n");
		}
		System.out.println(sb);
	}

}

 

- 각각의 좌표를 받아옵니다. 그리고 X 끼리의 차이를 Y끼리의 차이를 구해줍니다.

 

- 두 좌표간 차이가 만약 9 , 3 의 차이가 난다고 가정을 해서 설명하겠습니다.

 

- 3 , 3까지는 일정하게 이동이 가능하다는 것을 알 수 있습니다. -> 이때까지 이동한 횟수는 6이 됩니다.

 

- 각각의 차이의 차이를 구해줍니다. 9, 3이므로 6의 차이가 납니다.

 

- 직접 구해보면 3~4개를 해보면 규칙을 찾을 수 있습니다.

 

- 홀수일 때는 각 차이의 차이의 두배 -1 값 만큼 추가적으로 이동을 했습니다.

 

- 짝수일 때는 각 차이의 차이의 두배 값 만큼 추가적으로 이동을 했습니다.

 

- 즉 6의 차이는 12 만큼의 추가적인 이동이 필요합니다. 즉 6 + 12 = 18 의 이동을 통해서 도달할 수 있습니다.