가로 길이가 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를 공백을 사이에 두고 출력한다.
6 4
4 1
8
0 1
t시간동안 (p+t,q+t) 이동했다고 생각하고, 반사하는 위치에 도달했을 때 x와 y를 따로 생각하면 이전에 오던 방향을 다시 되돌아간다고 생각하면 된다.
예를 들어 6×4인 격자공간에서 (0, 0)부터 시작한다고 했을 때 x만 생각하면 0, 1, 2, 3, 4, 5, 6까지 갔다가 5, 4, 3, 2, 1로 돌아온다. 이를 방향을 고려하지 않으면 1부터 12까지라고 생각할 수 있다. 즉 2×6의 너비를 이동한다고 생각하면 된다. 같은 상황에서 8시간이 지났다면 x는 8이 될테고, 6까지 간 뒤에 2시간을 더 갔고, 6시간째부터 방향이 바뀌었으므로 6-2 즉, 현재 x 좌표는 4가 될 것이다. 이를 식으로 표현하면 p%(2*w)인데 만약 이 값이 w보다 크다면 (2*w)-p%(2*w)이라는 것이다. y도 같은 방식으로 구하면 된다.
const fs = require('fs');
let [n, m, t] = fs.readFileSync(0, 'utf-8').toString().trim().split('\n');
let [w, h] = n.trim().split(' ').map(Number);
let [p, q] = m.trim().split(' ').map(Number);
t = Number(t);
p += t;
q += t;
let xCycle = 2 * w;
let yCycle = 2 * h;
let xPosition = p % xCycle;
if (xPosition > w) {
xPosition = xCycle - xPosition;
}
let yPosition = q % yCycle;
if (yPosition > h) {
yPosition = yCycle - yPosition;
}
console.log(xPosition, yPosition);
t가 200,000,000까지라는 걸 알았을 때 절대 반복문으로 풀면 안 될거라는 걸 인지했다면 금방 풀었을텐데... 난 아직도 이 문제가 초/중등부 문제라는 게 믿기지 않는다.