https://www.acmicpc.net/problem/10158
처음엔 시뮬레이션으로 풀었는데 가차없이 시간초과가 났다 (0.15초)
T가 최대 2억이기때문에 단순 for문으로는 해결을 못함을 깨닫고,
규칙을 찾으려고 노력했다.
풀이방법은 다음과 같다.
1. P와 Q는 벽에 닿으면 좌우, 상하로 방향을 바꿀뿐이다.
2. P와 Q에 T를 더해서 W, H가 몇번 반복되는지 (몇번 왕복하는지) 계산한다.
3. W를 P (P에 T를 더한상태) 로 나눴을때, 홀수라면 반대방향, 짝수라면 오른쪽으로 가고 있는 상태다.
4. P와 Q를 각각 답을 구해서 출력
input = __import__('sys').stdin.readline
w, h = map(int, input().split())
p, q = map(int, input().split())
t = int(input())
q += t;
p += t;
lastP = w-(p%w) if p//w%2 else p%w
lastQ = h-(q%h) if q//h%2 else q%h
print(lastP, lastQ)
9/12일 기준 Node.js는 타 코드와 동일한 로직으로 풀어도 시간초과가 난다.
const input = require("fs").readFileSync("/dev/stdin").toString().trim().split("\n");
const [W, H] = input[0].split(" ").map(Number);
let [P, Q] = input[1].split(" ").map(Number);
const T = parseInt(input[2]);
P += T;
Q += T;
let lastP = parseInt(P / W) % 2 ? W - (P % W) : P % W;
let lastQ = parseInt(Q / H) % 2 ? H - (Q % H) : Q % H;
console.log(lastP, lastQ);