[랜덤 마라톤] Move & Meet(18066)

lhs's avatar
Dec 13, 2024
[랜덤 마라톤] Move & Meet(18066)
notion image
notion image

1. 문제 풀이 아이디어

  • 이동 횟수가 작은 좌표를 우선적으로 다른 좌표 방향으로 이동시킨 후, 나머지 이동 횟수를 비교하여 문제를 해결할 수 있다.

2. 나의 정답 코드

public class Main { public static void main(String[] args) throws IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); long[][] n = new long[2][3]; for (int i = 0; i < 2; i++) { StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine()); for (int j = 0; j < 3; j++) { n[i][j] = Long.parseLong(stringTokenizer.nextToken()); } } Arrays.sort(n, Comparator.comparingLong(a -> a[2])); long[] result = new long[2]; for (int i = 0; i < 2; i++) { long dif = Math.abs(n[1][i] - n[0][i]); if (dif <= n[0][2]) { result[i] = n[1][i]; n[0][2] -= dif; } else { if (n[1][i] > n[0][i]) { result[i] = n[0][i] + n[0][2]; } else { result[i] = n[0][i] - n[0][2]; } n[0][2] = 0; } } for (int i = 0; i < 2; i++) { n[1][2] -= Math.abs(result[i] - n[1][i]); } if (n[1][2] < 0 || n[0][2] % 2 != n[1][2] % 2) { System.out.println("impossible"); } else { if (n[0][2] % 2 == 1) System.out.println(result[0] + " " + (result[1] + 1)); else System.out.println(result[0] + " " + result[1]); } bufferedReader.close(); } }

3. 정리

  • 입력을 받아 이동 횟수가 작은 좌표를 우선적으로 처리하기 위해 정렬한다.
  • 좌표의 차이를 계산한 뒤, 차이가 첫 번째 플레이어의 이동 횟수보다 작으면 결과 좌표를 두 번째 플레이어의 좌표로 설정하고, 이동 횟수를 감소시킨다.
  • 차이가 이동 횟수보다 크면, 첫 번째 플레이어의 좌표를 이동 횟수만큼 두 번째 플레이어 방향으로 이동시킨 결과를 저장한다.
  • 이후 두 번째 플레이어의 남은 이동 횟수를 결과 좌표와의 차이로 감소시킨다.
  • 두 번째 플레이어의 이동 횟수가 음수이거나, 두 플레이어의 남은 이동 횟수가 같은 홀짝이 아니라면 "impossible"을 출력한다.
  • 그렇지 않다면, 남은 이동 횟수가 짝수일 경우 결과 좌표를 그대로 출력하고, 홀수일 경우 y 좌표에 1을 더해 출력한다.
Share article

LHS's Study Space