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

N명 이동

Jedy_Kim 2021. 6. 17. 13:10
728x90

문제

세로 길이 N, 가로 길이 M 인 2차원 배열에 k 명의 사람이 있다. i 번 사람은 1 초에 di 방향으로 fi 만큼 이동하고, 만약 이동하려는 위치가 배열의 범위 밖이라면 배열을 나가기 직전의 위치에서 멈춘다. t 초 후 각 사람의 위치를 1 번 사람부터 출력하여라.

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

입력

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

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

(3 ≤ N, M, k, t ≤ 100, 1 ≤ yi ≤ N, 1 ≤ xi ≤ M, 0 ≤ di ≤ 3, 1 ≤ fi ≤ 100)

출력

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

입력의 예 1

4 5 3 2

1 1 3 1

2 2 1 2

3 5 2 3

출력의 예 1

1 3

4 2

3 1

입력의 예 2

9 11 3 4

4 2 2 20

5 3 1 15

8 5 3 2

출력의 예 2

4 1

9 3

8 11

입력의 예 3

25 31 3 2

4 2 2 20

5 3 1 15

8 5 3 2

출력의 예 3

4 1

25 3

8 9

입력의 예 4

25 31 3 6

4 2 2 20

5 3 1 15

8 5 3 2

출력의 예 4

4 1

25 3

8 17

설명

아래는 입출력의 예 1 번에 대한 그림이다.

# 코드

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
import sys
 
# i 번 사람은 1 초에 di 방향으로 fi 만큼 이동하고
# 만약 이동하려는 위치가 배열의 범위 밖이라면 배열을 나가기 직전의 위치에서 멈춘다.
# t 초 후 각 사람의 위치를 1 번 사람부터 출력하여라.
 
def move(row, col, direct, move_cnt):
  global t
  # 상, 하, 좌, 우
  dy = [-1100]
  dx = [00-11]
  for _ in range(t):
    for _ in range(move_cnt):
      ny = row + dy[direct]
      nx = col + dx[direct]
      if 0<ny<(n+1and 0<nx<(m+1):
        row = ny
        col = nx
  print(row, col)
    
if __name__ == "__main__":
  input = sys.stdin.readline
  n, m, k, t = map(int, input().split())
  
  for i in range(k):
    y, x, d, f = list(map(int, input().split()))
    move(y, x, d, f)
cs

 

반응형

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

2차원 큰 이동  (0) 2021.06.18
1차원 큰 이동  (0) 2021.06.18
ICEBERG[백준 2573]  (0) 2021.06.16
SLIKAR  (0) 2021.06.16
TOMATO[백준 7569]  (0) 2021.06.16