Stay Hungry Stay Foolish

SWEA

[SWEA] 1959. 두 개의 숫자열 (Python/D2)

dev스카이 2024. 10. 18. 18:50

[문제 링크] 👉 

 

SW Expert Academy

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

swexpertacademy.com


설명

N 개의 숫자로 구성된 숫자열 Ai (i=1~N) 와 M 개의 숫자로 구성된 숫자열 Bj (j=1~M) 가 있다. 아래는 N =3 인 Ai 와 M = 5 인 Bj 의 예이다.


Ai 나 Bj 를 자유롭게 움직여서 숫자들이 서로 마주보는 위치를 변경할 수 있다. 단, 더 긴 쪽의 양끝을 벗어나서는 안 된다.


서로 마주보는 숫자들을 곱한 뒤 모두 더할 때 최댓값을 구하라. 위 예제의 정답은 아래와 같이 30 이 된다.

[제약 사항]
N 과 M은 3 이상 20 이하이다.

 

풀이

리스트 중 길이가 짧은 것과 긴 것을 구분

min_list = min(aList, bList, key=len)
max_list = max(aList, bList, key=len)

 

  • key = len은 비교할 때 각 리스트의 길이를 기준으로 삼도록 지정한다.

 

첫 번째 인덱스부터 확인

    while cnt <= len(max_list) - len(min_list):
        sum = 0
        for i in range(len(min_list)):
            sum += min_list[i] * max_list[i + cnt] #곱한 뒤 합계
        max_sum = max(max_sum, sum) #최대값 저장
        cnt += 1
  • b리스트의 마지막 인덱스까지 확인하고자 할 때,
  • cnt가 현재 2이고, i가 2일 때
  • i + cnt, 즉 2 + 2 = 4가 되므로 마지막 인덱스까지 계산할 수 있다. 

 

cnt가 0일 때 

 

 

cnt가 1일 때

 

 

  • max_sum에는 곱해서 더한 누적합과 현재 최대값을 비교하여 더 큰 값을 저장한다.
  • 그리고 cnt를 증가한다. cnt가 b에서 a를 뺀 값과 같아질 때까지만 반복한다.

 

 

Solution

test_case = int(input())
for tc in range(1, test_case + 1):
    a, b = map(int, input().split())
    aList = list(map(int, input().split()))
    bList = list(map(int, input().split()))

    min_list = min(aList, bList, key=len)
    max_list = max(aList, bList, key=len)
    max_sum = 0
    cnt = 0
    while cnt <= len(max_list) - len(min_list):
        sum = 0
        for i in range(len(min_list)):
            sum += min_list[i] * max_list[i + cnt] #곱한 뒤 합계
        max_sum = max(max_sum, sum) #최대값 저장
        cnt += 1

    print("#%d %d" %(tc, max_sum))

 

 

👩‍💻 회고

max와 min을 쓸 때 리스트를 사용하기에 부적절하다. min()과 max()는 리스트의 을 비교하는 데 사용되기 때문이다.

그것도 모르고 그냥 썼다가 처음 제출 때 실패했다. min() 메서드에 리스트만 넘기면 그냥 길이 상관없이 반환된다. 무슨 기준으로 반환되는 건진 모르겠다. 

리스트 요소의 길이로 판별하고 싶으면 key=len을 인자로 넘기면 된다.