[문제 링크] 👉
설명
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을 인자로 넘기면 된다.
'SWEA' 카테고리의 다른 글
[SWEA] 1288. 새로운 불면증 치료법 (Python/D2) (1) | 2024.10.19 |
---|---|
[SWEA] 1948. 날짜 계산기 (Python/D2) (0) | 2024.10.18 |
[SWEA] 1961. 숫자 배열 회전 (Python/D2) (1) | 2024.10.18 |
[SWEA] 1976. 시각 덧셈 (Python/D2) (0) | 2024.10.16 |
[SWEA] 1284. 수도 요금 경쟁 (Python/D2) (4) | 2024.10.16 |