728x90

백준 10158번 개미
https://www.acmicpc.net/problem/10158
풀이법
해당 문제는 단순하게 생각했을때 그냥 개미를 시뮬레이션 해서 풀수있을것처럼 보이고, 실제로 해당방식으로 해결할시 원하는 값을 얻을수 있을것이다. 다만 시간 제한이 0.15초인것을 보면 이러한 구현을 원하는 문제는 아닌듯 보인다.

개미는 대각선으로 움직이고, 벽을 부딪히면 반대방향으로 움직인다 (양옆벽 부딪히면 좌우반전, 위아래 벽은 상하반전)
때문에 좌우, 상하에 대해서만 따로따로 생각해서 계산해도 큰 문제 없을것이다.
예시 입력,출력을 보면
좌우: 4시작 -> 2초후 6에서 반전 -> 8초후 0에서 종료
상하:1시작 -> 3초후 4에서 반전 -> 7초후 0에서 반전 -> 8초후 1에서 종료다.


일단 높이든, 너비든 다음처럼 두번을 움직이면 결국 초기와 동일한 벡터과 위치를 가지게 되기 때문에 시간은 2*길이 의 나머지로 계산이 가능하다.
# 주기
tw = (t%2*w)
th = (t%2*h)
그러면 이제 시간에 따른 숫자 규칙을 찾아보았다.
0~w-x에서는 증가
w-x초일때 위치는 w에 도달하고 이후 감소,
2w-x초일때 0에 도달하고 이후 증가,
0 (w-x) (2w-x) (2w)
4 4+1 4+2 4+1 4 4-1 4-2 4-3 4-4 4-3 4-2 4-1 4
3가지 구간을 얻었으니 단순하게 함수로 만들어봤다.
def getPosition(time, lengh, position):
if(time < lengh-position):
return position+time
elif(time < 2*lengh-position):
return lengh-(time-(lengh-position))
else:
return (time-(2*lengh-position))
코드
import sys
w,h = map(int,sys.stdin.readline().rstrip().split(" "))
x,y = map(int,sys.stdin.readline().rstrip().split(" "))
t= int(sys.stdin.readline().rstrip())
def getPosition(time, lengh, position):
if(time < lengh-position):
return position+time
elif(time < 2*lengh-position):
return lengh-(time-(lengh-position))
else:
return (time-(2*lengh-position))
# 주기
tw = (t%(2*w))
th = (t%(2*h))
resultx = getPosition(tw,w,x)
resulty = getPosition(th,h,y)
print(resultx,resulty)
솔직히 간단하게 만들어서 제출한거라 시간초과나고 다시 설계해야할줄 알았는데, 40ms로 여유롭게 통과했다.

728x90
'백준' 카테고리의 다른 글
| 백준 1094번 막대기 (Python 문제풀이) (1) | 2025.10.02 |
|---|---|
| 백준 1021번 회전하는 큐 (Python 문제풀이) (0) | 2025.10.01 |
| 백준 1402번 아무래도이문제는A번난이도인것같다 (Python 문제풀이) (0) | 2025.09.30 |