[백준] 1744 수 묶기

새싹·2021년 11월 11일
0

알고리즘

목록 보기
21/49

📌문제 링크

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)

너무 길게 짰나 싶은 생각도 들지만.. 어쨌든 맞았다!

0개의 댓글