문제
가로 길이가 w이고 세로 길이가 h인 2차원 격자 공간이 있다. 이 격자는 아래 그림처럼 왼쪽 아래가 (0,0)이고 오른쪽 위가 (w,h)이다. 이 공간 안의 좌표 (p,q)에 개미 한 마리가 놓여있다. 개미는 오른쪽 위 45도 방향으로 일정한 속력으로 움직이기 시작한다. 처음에 (p,q)에서 출발한 개미는 1시간 후에는 (p+1,q+1)로 옮겨간다. 단, 이 속력으로 움직이다가 경계면에 부딪치면 같은 속력으로 반사되어 움직인다.

위 그림은 6×4 격자에서 처음에 (4,1)에서 출발한 개미가 움직인 길을 보여주고 있다. 처음에 (4,1)에 있는 개미는 2시간 후에 (6,3)에 있으며 8시간 후에 (0,1)에 있다. 만일 그 개미가 처음에 (5,3)에 있었다면 매 시간마다 (6,4), (5,3), (4,2), (3,1)로 움직인다.
여러분은 크기 w×h인 격자 공간에서 처음에 (p,q)에서 출발하는 개미의 t시간 후의 위치 (x,y)를 계산하여 출력해야 한다. 개미는 절대 지치지 않고 같은 속력으로 이동한다고 가정한다.
문제에서 w와 h는 자연수이며 범위는 2 ≤ w,h ≤ 40,000이다. 그리고 개미의 초기 위치 p와 q도 자연수이며 범위는 각각 0 < p < w과 0 < q < h이다. 그리고 계산할 시간 t의 범위는 1 ≤ t ≤ 200,000,000이다.
입력
첫줄에는 w와 h가 공백을 사이에 두고 주어진다. 그 다음 줄에는 초기 위치의 좌표값 p와 q가 공백을 사이에 두고 주어진다. 3번째 줄에는 개미가 움직일 시간 t가 주어진다.
출력
출력은 t 시간 후에 개미의 위치 좌표 (x,y)의 값 x와 y를 공백을 사이에 두고 출력한다.
예제 사진에서 x좌표와 y좌표를 각각 보면, 일정한 주기를 이룬다는 것을 알 수 있다.
먼저 x 좌표는 4 - 5 - 6 - 5 - 4 - 3 - 2 - 1 - 0 - 1 - 2 - 3 - 4 를 반복한다.
시작 좌표가 4라서 이해하기 조금 힘들다면, 시작점이 0인 경우를 생각해 볼 수 있다.
0 - 1 - 2 - 3 - 4 - 5 - 6 - 5 - 4 - 3 - 2 - 1 - 0 을 반복하는 것이다.
사각형의 가로 길이를 W라고 하고, 시작점의 x좌표를 p라고 하면, p가 0일 때는 0부터 W, W부터 0 까지를 반복하고 p가 증가할수록 주기가 1씩 당겨진다.
즉 x좌표의 이동 주기는 (T+p) % 2 * W와 같다.
마찬가지로 y좌표의 이동 주기는 (T+q) % 2 * H와 같다.
여기에 2*W(H) 주기에서 1~W까지는 증가, W+1~2*W까지는 감소한다.
이를 반영하여 구현한 코드는 다음과 같다.
package BOJ0815;
import java.util.Scanner;
public class BOJ_10158_개미 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int W = sc.nextInt();
int H = sc.nextInt();
int P = sc.nextInt();
int Q = sc.nextInt();
int T = sc.nextInt();
// x가 0일 때, W가 6이라면 0 1 2 3 4 5 6 5 4 3 2 1 0 .. -> 2*W 주기
// x가 1이라면 1 2 3 ... x가 2라면 2 3 4 ...
// -> 현재 좌표 + 시간을 주기로 나눈 나머지
int x = (P + T) % (2 * W);
int y = (Q + T) % (2 * H);
x = (x <= W) ? x : 2 * W - x; // x가 W보다 작으면 증가하는 주기, 감소하는 경우만 따로 처리
y = (y <= H) ? y : 2 * H - y;
System.out.println(x + " " + y);
}
}
'문제 풀이 > BOJ' 카테고리의 다른 글
[백준] 4949 - 균형잡힌 세상 (자바/Java) 스택 Stack (0) | 2022.08.16 |
---|---|
[백준] 9012 - 괄호 (자바/Java) 스택 Stack 괄호 검사 (0) | 2022.08.16 |
[백준] N과 M (자바/Java) 순열, 조합, 중복순열, 중복조합 (0) | 2022.08.12 |
[백준] 2527 - 직사각형 (자바/Java) (0) | 2022.08.11 |
[백준] 2567 - 색종이 2 (자바/Java) (0) | 2022.08.10 |