BOJ-10158 개미
https://www.acmicpc.net/problem/10158
문제 소개
격자 공간의 크기와 개미의 시작 위치가 주어졌을 때, 주어진 시간동안 개미가 움직인 후 개미의 위치를 구한다.
개미가 공간의 경계면에 부딪히는 경우 반사되어 움직인다.
문제 풀이
개미의 x좌표와 y좌표 모두 1시간에 1씩 변화하며, 경계면에 부딪히는 경우 증가에서 감소 또는 감소에서 증가로 변경된다는 점에 착안하였다.
예를 들어, w
, h
, p
, q
가 아래와 같이 주어진다면
1
2
6 4
4 1
개미는 다음과 같이 이동한다.
x좌표 : 4 $\rightarrow$ 5 $\rightarrow$ 6 $\rightarrow$ 5 $\rightarrow$ 4 $\rightarrow$ 3 $\rightarrow$ $\dotsb$
y좌표 : 1 $\rightarrow$ 2 $\rightarrow$ 3 $\rightarrow$ 4 $\rightarrow$ 3 $\rightarrow$ 2 $\rightarrow$ $\dotsb$
즉, x좌표와 y좌표는 w
와 h
를 주기로 가지며, t
를 주어진 횟수로 하여 이동하게 된다.
필자는 나머지 연산 과정을 연상하기 쉽도록 개미가 오른쪽 경계면에 처음으로 도착한 시점을 출발점이라고 간주하고 계산하였다.
남은 이동횟수는 나머지 연산을 통해, 그리고 이동 방향은 나눗셈의 몫을 통해 구하였다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from sys import stdin
input = lambda: stdin.readline().rstrip()
w, h = map(int, input().split())
p, q = map(int, input().split())
t = int(input())
# 오른쪽 끝을 찍고 남은 횟수로 이동
if (t - (w - p)) // w % 2 == 0:
p = w - (t - (w - p)) % w
else:
p = (t - (w - p)) % w
if (t - (h - q)) // h % 2 == 0:
q = h - (t - (h - q)) % h
else:
q = (t - (h - q)) % h
print(p, q)
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.