문제링크
문제 요약
1. 주어진 수열에서 두 수를 묶어 곱한 후 모든 값을 합할 때 나올 수 있는 최대값을 구하라
2. 수열의 모든 수는 단 한번만 묶거나, 아니면 묶지 않아야한다.
어떻게 풀어야 할까?
1. 곱할 경우 값이 커지는 경우와 적어지는 경우를 나누기
2. 1일 경우 양수와 곱하더라도 값이 적어짐으로 따로 구분하기
코드
# 계산을 도와줄 함수
def func(numbers):
idx = 0
result = 0
length = len(numbers)
while idx < length-1:
result += numbers[idx] * numbers[idx + 1]
idx += 2
if idx != length:
result += numbers[idx]
return result
n = int(input())
numbers = list([int(input()) for _ in range(n)])
# 음수, 0
sub1 = sorted(list(filter(lambda x:0 >= x, numbers)))
# 1
one = list(filter(lambda x:x==1, numbers))
# 양수
sub2 = sorted(list(filter(lambda x:1 < x, numbers)), reverse=True)
result = 0
result += func(sub1)
result += func(sub2)
for n in one:
result += n
print(result)
코드 풀이
line 1. filter로 나눈 list에 동일한 코드를 적용시키기 위한 함수
line 17-21. filter를 사용해서 주어진 수열을 알맞게 구분함
line 26. 1은 항상 묶지 않고 더해야함으로 따로 계산
피드백
기존 리스트를 기준에 따라 나누고 싶을 때 filter 함수를 사용해보자
-> filter함수는 filter타입의 object를 반환하기 때문에 형변환 후 사용하도록 하자