https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWyNQrCahHcDFAVP
8458. 원점으로 집합과 비슷한 문제입니다.
상하좌우로 N칸을 움직여서 원하는 목적지로 가면 되지만 (상,하)와 (좌,우)를 연속으로 움직일 수 없고 번갈아가면서 움직여야합니다.
8458번과 비슷한 방식으로 접근할 수 있습니다.
내 위치와 목적지의 X좌표, Y좌표의 거리(절댓값)가 홀짝이 같은지에 따라 정답이 나뉩니다.
예를들어 내 위치가 (0,0)이고 목적지가 (2,4)처럼 X Y좌표 모두 짝수거리만큼 떨어져있다면,
상우상우로움직여 (2,2)위치로 이동하고,상 두번을 움직이기 위해 상 좌 상 우 이런식으로 좌우 움직임을 상쇄해서 도착하면 됩니다.
홀수의 경우에도 더 작은 거리를 0으로 만들만큼 움직이면, 남은 짝수 거리를 같은 방법으로 상쇄하여 도착합니다.
즉, X Y 거리가 모두 짝수거나 모두 홀수면 (둘 중 더 먼 거리 * 2배) 만큼 움직여서 목적지에 도착할 수 있습니다.
둘의 홀짝이 다르면 어떨까요?
내 위치가 (0,0)이고 목적지가 (2,3)이라면
상우상우로 움직여 (2,2)에 도착하고 바로 상으로 움직여 5번만에 목적지에 도착할 수 있습니다.
(우상우상으로 움직이면 도착을 못합니다)
이때는 (둘 중 더 먼 거리 * 2배) - 1 만큼 움직여서 목적지에 도착할 수 있습니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class q8382_SWEA_방향전환 {
static StringTokenizer st;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
int answer;
for (int tc = 1; tc <= T; tc++) {
st = new StringTokenizer(br.readLine());
int aX = Integer.parseInt(st.nextToken());
int aY = Integer.parseInt(st.nextToken());
int bX = Integer.parseInt(st.nextToken());
int bY = Integer.parseInt(st.nextToken());
int x = Math.abs(aX - bX);
int y = Math.abs(aY - bY);
answer = Math.abs(x - y) % 2 == 0 ? 2 * Math.max(x, y) : 2 * Math.max(x, y) - 1;
sb.append("#").append(tc).append(" ").append(answer).append("\n");
}
System.out.println(sb);
}
}
728x90
'🔍 알고리즘 > SWEA' 카테고리의 다른 글
[Java] SWEA 3234.준환이의 양팔저울 D4 (0) | 2022.07.04 |
---|---|
[Java] SWEA 7699.수지의 수지맞는 여행 D4 (0) | 2022.07.04 |
[Java] SWEA 8458.원점으로 집합 D4 (0) | 2022.07.03 |
[Java] SWEA 11112.다트게임 D3 (0) | 2022.07.01 |
[Java] SWEA 11112.셀로판지 D4 (0) | 2022.06.30 |