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

이동 알고리즘 2

Jedy_Kim 2021. 6. 18. 14:25
728x90

문제

세로 길이 N, 가로 길이 M 인 2 차원 배열에 k 명의 사람이 있다. i 번 사람은 1 초에 di 방향으로 fi 만큼 이동하고, 배열의 끝에 도착하면 다음 이동 시 뒤로 돌아서 반대 방향으로 이동한다. t 초 후 각 사람의 위치를 1 번 사람부터 출력하여라.

이 배열의 왼쪽 위 좌표는 (1, 1) 이고, 오른쪽 아래 좌표는 (M, N) 이다. xi 는 i 번 사람의 가로 방향 위치, yi 는 i 번 사람의 세로 방향 위치를 의미한다. di 는 0, 1, 2, 3 중 하나로 주어지는데, 순서대로 상하좌우를 의미한다.

입력

첫 줄에 N, M, k, t 가 주어진다.

두 번째 줄 부터 k 줄에 걸쳐 yi, xi, di, fi 가 주어진다.

(3 ≤ N, M ≤ 1,000,000,000, 1 ≤ t, k ≤ 100,

1 ≤ yi ≤ N, 1 ≤ xi ≤ M, 0 ≤ di ≤ 3, 1 ≤ fi ≤ 1,000,000,000)

출력

k 줄에 걸쳐 각 사람의 t 초 후 위치를 y, x 순서로 출력한다.

입력의 예 1

4 5 3 2

1 1 3 1

2 2 1 2

3 5 2 3

출력의 예 1

1 3

2 2

3 3

입력의 예 2

34615 23432 3 435

4531 23431 0 783

4897 21541 1 3288

34600 4897 3 23464

출력의 예 2

10066 23431

18613 21541

34600 4181

입력의 예 3

3461542 2318432 3 1000000

457831 233431 0 78353

4897 21541 1 3288

34600 4897 3 23464

출력의 예 3

2899907 233431

459055 21541

34600 1483177

입력의 예 4

3461542 2318432 3 43345

457831 233431 0 78353

4897 21541 1 3288

34600 4897 3 23464

출력의 예 4

3442776 233431

2861467 21541

34600 1579199

 

#코드

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
36
37
38
39
40
41
42
import sys
 
# 세로 길이 N, 가로 길이 M 인 2 차원 배열에 k 명의 사람이 있다.
# i 번 사람은 1 초에 di 방향으로 fi 만큼 이동
# 배열의 끝에 도착하면 다음 이동 시 뒤로 돌아서 반대 방향으로 이동한다.
# t 초 후 각 사람의 위치를 1 번 사람부터 출력하여라.
 
# 이 배열의 왼쪽 위 좌표는 (1, 1) 이고, 오른쪽 아래 좌표는 (M, N) 이다
# xi 는 i 번 사람의 가로 방향 위치, yi 는 i 번 사람의 세로 방향 위치를 의미
# di 는 0, 1, 2, 3 중 하나로 주어지는데, 순서대로 상하좌우를 의미한다.
 
def get_next(cur, dist, max_size):
  global t, d, next_idx
  while cur + dist < 1 or cur + dist > max_size:
    d = next_idx[d]
    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
  N, M, k, t = map(int, input().split())
  # 상,하,좌,우
  dy = [-1100]
  dx = [00-11]
  next_idx = [1032# 상 하 좌 우 방향의 반댓값
  
  for i in range(k):
    y, x, d, f = map(int, input().split())
    if d == 0 or d == 1: t%=2*N-2
    else: t%=2*M-2
    for _ in range(t):
      y = get_next(y, f*dy[d], N)
      x = get_next(x, f*dx[d], M)
    print(y, x)
cs

 

반응형

'CS > 알고리즘_문제풀이(파이썬)' 카테고리의 다른 글

중복 조회 2  (0) 2021.06.18
중복 조회 1  (0) 2021.06.18
2차원 큰 이동  (0) 2021.06.18
1차원 큰 이동  (0) 2021.06.18
N명 이동  (0) 2021.06.17