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

장애물 처리 알고리즘

Jedy_Kim 2021. 5. 15. 15:39
728x90

문제

N x M 크기의 2 차원 배열이 있다. 이 배열의 가장 왼쪽 위 칸은 (0, 0)으로, 가장 오른쪽 아래 칸은 (N-1, M-1)로 표현한다.

배열의 크기 n, m 과 배열의 값들, y, x, d, r 이 주어질 때, 이 배열의 (y, x) 위치에서 d 방향으로 r 만큼 이동한 위치의 값을 출력하는 프로그램을 작성하여라.

d 가 0 이면 오른쪽, 1 이면 왼쪽, 2 면 아래, 3 이면 위를 의미한다. 단, 이동 과정에서 -1 을 만나면 그 이전 위치에서 멈춘다. 처음 위치와 도착 위치 모두 배열 안에 있고, 처음 위치는 -1 이 아님이 보장된다.

입력

첫 번째 줄에 배열의 크기 N, M 이 주어진다.

두 번째 줄부터 N 개의 줄에 걸쳐 배열의 값들이 주어진다. 각 줄마다 M 개씩 숫자가 존재한다.

마지막 줄에 y, x, d, r 이 주어진다.

(3 ≤ N, M ≤ 100, 1 ≤ y ≤ N - 1, 1 ≤ x ≤ M - 1, 0 ≤ d < 4)

(if d: 2, 3 → 0 ≤ y ± r < N, if d: 0, 1 → 0 ≤ x ± r < M)

출력

첫 줄에 문제에서 구해야하는 위치 값을 출력한다.

입력의 예 1 

4 5

2 -1 1 5 4

1 5 5 4 2

1 8 3 6 1

8 9 7 2 4

3 1 3 3

출력의 예 1 

5

입력의 예 2 

4 5

2 3 1 5 4

1 -1 5 4 2

1 8 3 6 1

8 9 7 2 4

3 1 3 3

출력의 예 2 

8

입력의 예 3 

4 5

2 3 1 5 4

1 3 5 4 2

1 8 3 6 1

8 9 7 2 -1

0 4 2 3

출력의 예 3 

1

입력의 예 4 

4 5

2 3 1 5 4

1 3 5 4 2

-1 8 3 6 1

8 9 7 2 4

2 2 1 2

출력의 예 4 

8

설명

입력의 예 1 번의 경우 (3, 1) 위치에 있는 9 가 출발지점이다. d 가 3, r 이 3 이므로 위로 3 칸 이동해야 한다. 하지만 2 칸은 정상적으로 이동해서 (1, 1)로 이동한다. 그 다음 칸인 (0, 1)로 이동하는 시점에 (0, 1)이 -1 이므로, 이동하지 못하고 (1, 1)위치에 정지하게 된다. 따라서 5가 정답이다.

 

# 코드

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
getInfo = list(map(int, input().split()))
getFrame = [list(map(int, input().split())) for _ in range(getInfo[0])]
frame = [[-1 for _ in range(getInfo[1+ 1)] for _ in range(getInfo[0+ 2)]
getPosInfo = list(map(int, input().split())) 
yPos = getPosInfo[0]+1
xPos = getPosInfo[1]+1
= getPosInfo[2]
 # 0: 오, 1 : 왼, 2 : 하, 3 : 상
= [001-1]
= [1-100]
= getPosInfo[3]
 
for i in range(len(getFrame)):
  for j in range(len(getFrame[i])):
    frame[i+1][j+1= getFrame[i][j]
    
## 로직
for i in range(r):
  
  if frame[yPos+y[d]][xPos+x[d]] == -1:
    break
  
  yPos += y[d]  
  xPos += x[d]
 
cs

 

반응형

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

이동 알고리즘  (0) 2021.05.15
경계 처리 알고리즘  (0) 2021.05.15
상하좌우 SHIFT 알고리즘  (0) 2021.05.14
회전 알고리즘  (0) 2021.05.14
역방향  (0) 2021.05.14