🎁 [문제]
서로 마주보는 숫자들을 곱한 뒤 모두 더할 때 최댓값을 구하라.
예제의 정답은 아래와 같이 30 이 된다.
# [input]
10
3 5
1 5 3
3 6 -7 5 4
7 6
6 0 5 5 -1 1 6
-4 1 8 7 -9 3
...
# [output]
30
63
...
# [테스트 케이스의 개수 T]
T = int(input())
# [10번 테스트 해야하니, T만큼 for문을 돌려준다.]
for tc in range(1, T + 1):
# 다음에 오는 input값인, 두 개의 인덱스 길이를 N과 M으로 받아준다.
N, M = map(int, input().split())
# 다음에 오는 input값인, 두 리스트를 A와 B로 받아준다.
A = list(map(int, input().split()))
B = list(map(int, input().split()))
# [M이 큰 숫자를 가지도록 설정한다.]
# 주의!!
# N과 M의 순서를 바꾸게 되면 다음에 따라오는 A, B의 순서도 바뀌어야 함!!
if N > M:
N, M = M, N
A, B = B, A
# [가장 높은 합의 값을 저장하기 위해 max_sum변수를 선언]
max_sum = 0
# 작은 열과 더 많은 열을 돌릴 수 있는 최대의 수는
# M-N+1 의 규칙성을 가지고 있다.
# M-N+1 은 총 for문 돌리는 횟수를 정해주기도 하지만
# M의 시작점을 정해주는 역할도 한다.
for i in range(M - N + 1):
# [임시 저장소 temp 선언]
temp = 0
# 작은 박스열과 많은 박스열이 있으면
# 작은 박스열 쪽은 한 번 돌릴 때 모든 인덱스가 돌아가고
# 더 많은 박스열을 가진 쪽은 모든 인덱스를 한 번에 다 돌리지 못한다.
# 작은 박스열과 길이 차이가 나기 때문에!
# 항상 작은 박스열의 전체 길이에 맞추어 인덱스가 돌아간다.
# 따라서, range(N)이다!
for j in range(N):
# [j인덱스를 i 값으로 조절]
temp += A[j] * B[j+i]
# [temp와 max_sum을 비교하여 큰 값을 항상 max_sum에 담아준다.]
if temp > max_sum:
max_sum = temp
print("#{} {}".format(tc, max_sum))
🍦 [복습]
# 1. 210218
조금 얕게 공부를 했던 것 같다. 이번에서야 진정으로 해당 문제를 이해했다. 확실히 종이에 직접 그리면서 하는 것이 더 빨리 해결방법을 캐치하는 것에 도움을 주었다.
# 2. 210225
이중 for문은 이해된 줄 알았으나 이해되지 않았다고 느끼는 적이 한 두번이 아니다...
어렵다 정말
# 3. 210301
이제 어느정도는 감이 오기 시작했다.
'# 3. APS > SWEA' 카테고리의 다른 글
SWEA # Python_D1_2072_홀수만 더하기 ✅ (0) | 2021.02.14 |
---|---|
SWEA # Python_D3_11457_gravity (0) | 2021.02.13 |
SWEA # Python_D2_1966_숫자를 정렬하자 (버블소트) ✅ (0) | 2021.02.12 |
SWEA # Python_D1_2071_평균값 구하기 ✅ (0) | 2021.02.12 |
SWEA # Python_D1_11485_여러가지input ✅ (0) | 2021.02.11 |