문제
N × M 크기의 2차원 배열이 있다.
이 배열의 가장 왼쪽 위 칸은 (0, 0)으로, 가장 오른쪽 아래 칸은 (N-1, M-1)로 표현한다. 총 q번의 질문에 대한 답을 하는 프로그램을 작성하여라.
각 질문은 두 정수 d, r 로 주어지는데, 이전 출력 위치를 (y, x)라고 할 때, 이 배열의 (y, x) 위치에서 d방향으로 r 만큼 이동한 위치의 값을 출력해야 한다.
d 가 0 이면 오른쪽, 1 이면 왼쪽, 2 면 아래, 3 이면 위를 의미한다.
이동 과정에서 -1 을 만나거나 배열의 범위 밖으로 나가려고 할 경우, 그 이전 자리에서 멈춘다.
프로그램 시작 시 초기 y, x 는 모두 0 이다.
입력
첫 번째 줄에 배열의 크기 N, M 과 질문의 수 q 가 주어진다.
두 번째 줄부터 N 개의 줄에 걸쳐 배열의 정보가 주어진다. 각 줄에는 M 개의 숫자가 주어진다.
바로 다음 줄부터 q 개의 줄에 걸쳐 질문 정보가 주어진다. 각 줄에는 d, r 이 주어진다.
(3 ≤ N, M ≤ 100, 1 ≤ q ≤ 100, 0 ≤ d < 4, 1 ≤ r ≤ max(N, M))
출력
q 개의 줄에 걸쳐 문제에서 구하고자하는 값을 출력한다.
입력의 예 1
4 5 3
2 -1 1 5 4
1 5 5 4 2
1 8 3 -1 1
8 9 7 2 4
2 2
0 4
3 4
출력의 예 1
1
3
1
입력의 예 2
4 5 3
2 -1 1 5 4
1 5 5 4 2
-1 8 3 -1 1
8 9 7 2 4
2 2
0 4
3 4
출력의 예 2
1
2
4
입력의 예 3
4 5 2
2 3 1 5 4
1 3 5 4 2
1 8 3 6 1
8 9 7 2 4
0 4
1 2
출력의 예 3
4
1
입력의 예 4
4 5 3
2 3 1 5 4
1 3 5 4 2
1 8 3 -1 1
8 9 7 2 4
2 2
1 1
0 3
출력의 예 4
1
1
3
설명
입력의 예 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
28
29
30
31
|
getInfo = list(map(int, input().split()))
q = getInfo[2]
getFrameInfo = [list(map(int, input().split())) for _ in range(getInfo[0])]
getPosInfo = list()
frame = [[-1 for _ in range(getInfo[1] + 2)] for _ in range(getInfo[0] + 2)]
for i in range(q):
getPosInfo.append(list(map(int, input().split())))
# 0: 오, 1 : 왼, 2 : 하, 3 : 상
y = [0, 0, 1, -1]
x = [1, -1, 0, 0]
for i in range(len(getFrameInfo)):
for j in range(len(getFrameInfo[i])):
frame[i+1][j+1] = getFrameInfo[i][j]
xPos = 1
yPos = 1
## 로직
for i in range(q):
d = getPosInfo[i][0]
r = getPosInfo[i][1]
for j in range(r):
if frame[yPos+y[d]][xPos+x[d]] == -1:
break
yPos += y[d]
xPos += x[d]
print(frame[yPos][xPos])
|
cs |
'CS > 알고리즘_문제풀이(파이썬)' 카테고리의 다른 글
회전판과 로봇 (robot.cpp) (0) | 2021.05.16 |
---|---|
baseball game (0) | 2021.05.16 |
경계 처리 알고리즘 (0) | 2021.05.15 |
장애물 처리 알고리즘 (0) | 2021.05.15 |
상하좌우 SHIFT 알고리즘 (0) | 2021.05.14 |