# 3. APS/SWEA

SWEA # Python_D2_1959_두 개의 숫자열 ✅

둥굴둥굴둥굴레차 2021. 2. 12. 16:25

 

🎁 [문제]

 

서로 마주보는 숫자들을 곱한 뒤 모두 더할 때 최댓값을 구하라.

예제의 정답은 아래와 같이 30 이 된다.
 

 

 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

# [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

 

이제 어느정도는 감이 오기 시작했다.