https://www.acmicpc.net/problem/1744
일단 1보다 큰 수가 있으면 곱하고, 1보다 같거나 작으면 더하는게 최댓값이 될 거라고 생각했다.
근데 1보다 같거나 작아도 0과 음수가 있으면 이 둘을 곱해서 0으로 만들어줘야 최댓값이 나왔다
그러면 음수가 2개 이상 있을때도 곱해서 양수로 만들어주는 게 맞겠지..?
처음엔 n > 1과 n <= 1 두 가지 경우의 수로 생각했는데
1. n > 1 (곱하는게 이득)
2. n == 1 (더하는게 이득)
3. n == 0 (음수가 홀수개 있으면 곱해주는게 이득, 양수만 있으면 더하는게 이득)
4. n < 0 (음수가 2개 이상 있으면 곱해주는게 이득)
이렇게 4가지 경우로 생각해야 하는 것 같다.
그리고 큰 수부터 작은 수 순서대로 정렬했는데 음수끼리 곱하는 건 절댓값이 큰 수끼리 곱하는 게 이득이라 양수랑 음수 배열을 따로 만들었다.. (0은 음수 배열에 포함)
# 1744 수 묶기
n = int(input())
p_num = [] # 양수 배열
n_num = [] # 음수 배열
nums = []
for i in range(n):
num = int(input())
nums.append(num)
if num > 0:
p_num.append(num)
else:
n_num.append(num)
sorted_positive_num = sorted(p_num, reverse=True)
sorted_negative_num = sorted(n_num)
result = 0 # 결과값
p_multi = 0 # n>1인 수끼리 곱함
n_multi = 0 # n<0인 수끼리 곱함
zero_cnt = 0 # 0 개수
# 양수 배열 계산
for n in sorted_positive_num:
# 1 이상이면 무조건 곱하는 게 이득
if n > 1:
if p_multi == 0: # 첫 번째 수 저장
p_multi = n
else:
p_multi *= n # 두 번째 수 곱함
result += p_multi # 결과값에 더해줌
p_multi = 0 # 한 번 묶었으니 초기화
elif n == 1: # 1일 때는 무조건 더하는게 이득
result += n
# 음수 배열 계산
for n in sorted_negative_num:
if n == 0: # 0 개수 카운트
zero_cnt += 1
elif n < 0:
if n_multi == 0: # 첫 번째 수 저장
n_multi = n
else:
n_multi *= n # 두 번째 수 곱함
result += n_multi # 결과값에 더해줌
n_multi = 0 # 한 번 묶었으니 초기화
# 남은 수 더함
if p_multi != 0:
result += p_multi
if n_multi != 0 and zero_cnt == 0:
result += n_multi
print(result)
너무 길게 짰나 싶은 생각도 들지만.. 어쨌든 맞았다!