문제풀이) 백준 - 1744 / 수 묶기

velg·2021년 5월 17일
0

문제링크

문제 요약

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를 반환하기 때문에 형변환 후 사용하도록 하자 
profile
초보 개발자

0개의 댓글