PS/BOJ&Programmers
[백준/10158] 개미 | 점화식 그게 뭔데 그거 어떻게 하는 건데
sebinChu
2023. 6. 29. 02:26
10158 개미
알고리즘
t의 범위가 1 ≤ t ≤ 200,000,000이므로 완전탐색을하면 타임아웃이다.
그렇다면 어떤 점화식을 세워서 문제를 풀어야 한다는 건데
1. x와 y의 독립성
이 문제는 1초의 시간이 지날 때
x = (x+1) or (x-1)이 되고
y = (y+1) or (y-1)이 된다.
따라서 각각의 값이 독립적으로 움직인다는 결론에 도달할 수 있다.
2. 이동 횟수와 이동 거리의 관계
x좌표와 y좌표는 각각 t만큼 이동을 하게 되고, 이 이동 주기가 2*w, 2*h이다.
아래와 같은 그래프를 보면 이해가 쉽다.
따라서 이동 자체에 대한 점화식은 다음과 같다.
- (p+t) % 2*w
- (q+t) % 2*h
이제 이동 좌표에 관한 점화식을 얻었으니, 거리를 구하면 된다.
거리는 수학적으로 뺄셈을 의미하기도 한다. 거리는 일반적으로 두 개체 사이의 공간상의 차이를 의미하기 때문이다.
여기서 문제는 벽면에 부딪힐 때마다 방향을 전환해야 한다는 것이다. 벽면에 부딪힐 때마다 방향을 전환하는 것에 대한 점화식은 다음과 같다.
- w - abs(w - (p+t)%(2*w))
- h - abs(h - (q+t)%(2*h))
현재 위치에서 다음 순간까지의 거리를 구해주는 것이다. 이때 방향 전환이 각 좌표에 -1, +1 하는 형식이므로 절댓값을 씌워준다.
전체 코드
import sys; input=sys.stdin.readline
w,h=map(int, input().split())
p,q=map(int, input().split())
t=int(input())
# 각각의 축의 이동 거리 점화식
x= w - abs(w - (p+t)%(2*w))
y= h - abs(h - (q+t)%(2*h))
print(x, y)
알게된 점
- 답이 쉽게 안보이면 점화식을 구해보자.
- 점화식을 세우려면 일단 단계별로 or 번호 순으로 아이디어를 정리해보자. 훨씬 일반화가 수월하다.
- 이런 문제를 접하자마자 아이디어를 떠올린다는 건 쉽지않다. 많은 문제를 풀어보면서 노련함을 쌓는게 중요하다고 느껴진다.