이동하기 5
문제
준규는 N×M 크기의 미로에 갇혀있다. 미로는 1×1크기의 방으로 나누어져 있고, 각 방에는 사탕이 놓여져 있다. (i, j)에 놓여져 있는 사탕의 개수는 Ai × 109 + Bj개이다. 미로의 가장 왼쪽 윗 방은 (1, 1)이고, 가장 오른쪽 아랫 방은 (N, M)이다.
준규는 현재 (1, 1)에 있고, (N, M)으로 이동하려고 한다. 준규가 (r, c)에 있으면, (r+1, c), (r, c+1)로 이동할 수 있고, 각 방을 방문할 때마다 방에 놓여져있는 사탕을 모두 가져갈 수 있다. 또, 미로 밖으로 나갈 수는 없다.
준규가 (N, M)으로 이동할 때, 가져올 수 있는 사탕 개수의 최댓값을 구하시오.
입력
첫째 줄에 미로의 크기 N, M이 주어진다. (1 ≤ N, M ≤ 100,000)
둘째 줄에는 A1, A2, ..., AN이, 셋째 줄에는 B1, B2, ..., BM이 주어진다. (0 ≤ Ai, Bj ≤ 9)
출력
첫째 줄에 준규가 (N, M)으로 이동할 때, 가져올 수 있는 사탕 개수를 출력한다.
힌트
예제로 만들 수 있는 미로는 다음과 같은 모양이며, 편의상 (i, j)에 놓여진 사탕의 개수는 Ai, Bj로 표시했다.
0, 4 | 0, 1 | 0, 9 | 0, 7 |
7, 4 | 7, 1 | 7, 9 | 7, 7 |
1, 4 | 1, 1 | 1, 9 | 1, 7 |
7, 4 | 7, 1 | 7, 9 | 7, 7 |
6, 4 | 6, 1 | 6, 9 | 7, 7 |
7, 4 | 7, 1 | 7, 9 | 7, 7 |
6, 4 | 6, 1 | 6, 9 | 6, 7 |
행에 값이 가장 큰 영향을 주기 때문에 가장 크게 사탕을 얻기 위해서는 행의 맥스 인덱스를 찾아야한다고 생각하였다.
어차피 이동하는 칸수는 다 동일하기 때문에 그 부분을 중점으로 생각해 보았다.
그러다가 생각한 부분이 max값이 여러개 있으면 문제가 생겨서 이 부분을 생각했을때 열의 맥스 인덱스를 생각을 하여 그 부분에서 내려오면서 조금씩 큰 값을 저장하다가 다시 마지막 행 맥스 인덱스에서 다시 오른쪽을 이동하면서 사탕을 저장.
import sys
input = sys.stdin.readline
N, M = map(int,input().split())
A = [0] + list(map(int,input().split()))
B = [0] + list(map(int,input().split()))
candys = 0
# 각 맥스값 저장
max_A = max(A)
max_B = max(B)
i = j = 1
# A 맥스 값이 유일하다면
if A.count(max_A) == 1:
# 오른쪽으로 이동할 인덱스
M_i = A.index(max_A)
while i <= N and j <= M:
# 사탕 저장
candys += A[i] * (10 ** 9) + B[j]
# 오른쪽으로 이동
if i == M_i:
# 다 이동하면 밑으로 이동
if j == M:
i += 1
continue
j += 1
# 아니면 밑으로
else:
i += 1
# 맥스값이 여러 개일 경우
# 마지막 인덱스에서 오른쪽으로 이동
else:
# 처음 맥스 인덱스
M_i = A.index(max_A)
# 마지막 맥스 인덱스
re_A = list(reversed(A))
M_li = N - re_A.index(max_A)
# j 맥스 인덱스
M_j = B.index(max_B)
while i <= N and j <= M:
candys += A[i] * (10 ** 9) + B[j]
# 맥스인덱스에 오면 오른쪽을 이동
if i == M_i:
# j 맥스 인덱스에서 밑으로
if j == M_j:
i += 1
continue
j += 1
# 마지막 맥스 인덱스에서 다시 오른쪽으로
elif i == M_li:
# 끝에 오면 밑으로
if j == M:
i += 1
continue
j += 1
# 나머지는 밑으로
else:
i += 1
print(candys)
'@@@ 알고리즘 > 백준 스터디' 카테고리의 다른 글
22981(휴먼 파이프라인) - 해결 (0) | 2021.09.29 |
---|---|
16174(점프왕 쩰리 (Large)) - 해결 (0) | 2021.09.29 |
10971(외판원 순회 2) - 해결 (0) | 2021.09.28 |
(3584)가장 가까운 공통 조상 - 참고 해결 (0) | 2021.09.23 |
1338(알 수 없는 번호) - 참고 해결 (0) | 2021.09.16 |