728x90
문제
세로 길이 N, 가로 길이 M 인 2 차원 배열의 (x, y) 위치에 사람이 있다. 이 사람은 초기 방향 d 로 1 초에 한 칸 씩 이동하는데, 배열의 끝에 도착하면 다음 이동 시 뒤로 돌아서 반대 방향으로 이동한다. t 초 뒤 이 사람의 위치를 x, y 순서로 출력하여라.
배열의 왼쪽 위 좌표는 (1, 1) 이고, 오른쪽 아래 좌표는 (M, N) 이다. d 는 0, 1, 2, 3 중 하나로 주어지는데, 순서대로 상하좌우를 의미한다. 이 배열의 인덱스는 1 부터 시작한다.
입력
첫 줄에 정수 N, M, y, x, d, t 가 주어진다.
(3 ≤ N, M ≤ 1,000,000,000, 1 ≤ y ≤ N, 1 ≤ x ≤ M, 0 ≤ d ≤ 3, 0 ≤ t ≤ 1,000,000,000)
출력
t 초 후 사람의 위치를 y, x 순서로 출력한다.
입력의 예 1
4 5 3 2 1 3
출력의 예 1
2 2
입력의 예 2
486123 97842 5465 2314 2 1678942
출력의 예 2
5465 84510
입력의 예 3
1894654 2313245 123456 576411 0 4346312
출력의 예 3
433552 576411
입력의 예 4
879546218 348978562 324567841 154875621 3 1000000000
출력의 예 4
324567841 241038625
#코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
import sys
def get_next(cur, dist, max_size):
while cur+dist < 1 or cur+dist > max_size:
if cur+dist<1:
dist += cur-1
cur = 1
dist = -dist
elif cur+dist>max_size:
dist -= max_size-cur
cur = max_size
dist = -dist
return cur+dist
if __name__ == "__main__":
input = sys.stdin.readline
# 4 5 3 2 1 3
n, m, y, x, d, t = map(int, input().split())
#상, 하, 좌, 우
dy = [-1, 1, 0, 0]
dx = [0, 0, -1, 1]
if d==0 or d==1:# 상, 하
t%=2*n-2
else: # 좌, 우
t%=2*m-2
row = get_next(y, t*dy[d], n)
col = get_next(x, t*dx[d], m)
print(row, col)
|
cs |
반응형
'CS > 알고리즘_문제풀이(파이썬)' 카테고리의 다른 글
중복 조회 1 (0) | 2021.06.18 |
---|---|
이동 알고리즘 2 (0) | 2021.06.18 |
1차원 큰 이동 (0) | 2021.06.18 |
N명 이동 (0) | 2021.06.17 |
ICEBERG[백준 2573] (0) | 2021.06.16 |