KEEP GOING

[python] 백준1744번 : 수 묶기 본문

카테고리 없음

[python] 백준1744번 : 수 묶기

jmHan 2022. 4. 6. 15:35
반응형

https://www.acmicpc.net/problem/1744

 

1744번: 수 묶기

길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에

www.acmicpc.net

 

 

문제를 풀기 위해 생각한 아이디어

- 음수가 나올 경우 접근 우선 순위  1) 음수 * 음수

                                                            2) 음수 * 0 

                                                            3) 음수 내버려두기

- 양수가 나올 경우  1) 양수 * 양수 ( 단, 두 양수 모두 1이면 안됨 -> 하나라도 1이라면 그냥 더해주는 게 낫다) 

                                                     ex. 1 3    1*3 < 1+3 

 

쉽게 풀기 위해서 0과 양수, 음수 배열을 따로 두어 관리하며 풀이하였다.

n = int(input())
zero, positive, negative = [], [], []
for _ in range(n):
    num = int(input())
    if num == 0: zero.append(num)
    elif num > 0: positive.append(num)
    else: negative.append(num)
negative.sort()
positive.sort()
result = [] # 그리디하게 구한 부분합들을 저장할 리스트 
while negative:
    num1 = negative.pop(0)
    # 음수 - 음수 짝이 있다면
    if negative:
        num2 = negative.pop(0)
        result.append(num1*num2)
    else:
        # 음수 - 0 짝이 있다면
        if zero:
            zero.pop()
        else:
            result.append(num1)
while positive:
    num1 = positive.pop()
    if num1 == 1:
        result.append(num1)
        continue
    # 양수 - 양수 짝이 있다면
    if positive:
        num2 = positive.pop()  
        if num2 == 1:
            result.append(num1)
            result.append(num2)
            continue
        result.append(num1*num2)
    else:
        result.append(num1)
print(sum(result))

 

처음 실패한 반례) num2에서 1인지 검사하는 조건을 빼먹어서 틀림.

                        다음과 같은 반례가 올 경우, num2이 1인지 검사해서 1이라면 num1과 곱하지 말고 result에 저장한다.

6
5
4
3
1
1
1
반응형
Comments