CS/알고리즘_문제풀이(파이썬)

2차원 큰 이동

Jedy_Kim 2021. 6. 18. 11:56
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 = [-1100]
  dx = [00-11]
  
  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