문제 링크
- 이 문제를 간단하게 이야기해보면, 두 좌표가 주어지고, 첫 좌표가 두번째 좌표까지 이동하는데 걸리는 이동횟수를 구하는 문제이다.
- 단순히 이동만 하면 좋은데 이동하는 방법은 세로로 한칸 가로로 한칸 을 반복하며 이동을 해야 한다.
- 이 문제에 대한 해결은 규칙을 찾아서 점화식을 이용해서 문제를 풀었습니다.
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 의 이동을 통해서 도달할 수 있습니다.
'Algorithm > SWEA 알고리즘' 카테고리의 다른 글
SWEA_5607 조합(자바) / 페르마의 소정리 (0) | 2021.04.28 |
---|---|
SWEA_2115 벌꿀채취(자바) / 조합 + 부분 집합 (0) | 2021.04.27 |
SWEA_5644 무선충전(자바) (0) | 2021.04.20 |
SWEA_5656 벽돌깨기(자바) (0) | 2021.04.20 |
SWEA_4014 활주로 건설(자바) (0) | 2021.04.19 |