1744-バンドル


📚 1744-バンドル


バンドル
 

理解する


私のような人は、すべての状況が条件通りに処理されていますが、これは悪い方法だと気づきました.
 
✔¥は良い解決策として
負数は昇順、正数は降順、1は乗算
(0は負数になります.)
  • 0と負数の合計が奇数の場合、最小値を正解に加算します.
  • 0と負数の数の和が偶数であれば、2つの数を乗じて正解を加算します.
  •  

    ソース


    最初の私のソース
    import sys
    
    read = sys.stdin.readline
    
    n = int(read())
    
    arr = []
    
    minus_cnt = 0
    
    for _ in range(n):
        d = int(read())
        arr.append(d)
    
        if d < 0: minus_cnt += 1
    
    arr.sort()
    
    result = 0
    before = 0
    cnt = 1
    zero_check = False
    
    check = False
    
    for i in range(n - 1, -1, -1):
        # print("i : ", i, " arr : ", arr[i])
        # 양수일 때
        if arr[i] > 0:
            # 1에 도착할 시
            if arr[i] == 1:
                result += 1
                before = 0
            # cnt가 홀 수일 때
            elif cnt % 2:
                before = arr[i]
                result += before
            else:
                result += (before * arr[i])
                result -= before
                before = 0
    
            cnt += 1
    
        # 0일 때
        elif arr[i] == 0:
            # 음수자리가 홀 수이면 0이 존재한다면 곱해줘야 한다.
            if minus_cnt % 2 != 0:
                zero_check = True
        else:
            if not check:
                check = True
                cnt = 0
                # 만약 남은 음수들이 홀 수개라면
                if minus_cnt % 2 != 0:
                    # 0이 존재한다면
                    if zero_check:
                        result += 0 * arr[i]
                    else:
                        result += arr[i]
                else:
                    # 남은게 짝수라면
                    cnt = 1
                    before = arr[i]
            else:
                if cnt % 2:
                    before = arr[i]
                else:
                    result += (before * arr[i])
                    before = 0
            cnt += 1
    
    print(result)
    
     
    良いソリューションのソース
    import sys
    
    read = sys.stdin.readline
    
    n = int(read())
    
    arr = []
    
    # 음수, 양수, 1 리스트 만들기
    minus_list = []
    plus_list = []
    one_list = []
    ans = 0
    
    # 입력 값 받기
    for i in range(n):
        input_num = int(input())
        if input_num > 1:
            plus_list.append(input_num)
        elif input_num  <= 0:
            minus_list.append(input_num)
        else:
            one_list.append(input_num)
    
    plus_list.sort(reverse=True)
    minus_list.sort()
    
    # 양수 계산
    # 양수의 개수가 홀수라면 제일 작은 값을 정답에 더하기
    if len(plus_list) % 2 == 1:
        ans += plus_list[len(plus_list)-1]
        for j in range(0, len(plus_list)-1,2):
            ans += plus_list[j] * plus_list[j+1]
    # 양수의 개수가 짝수면 두 수를 곱하고 정답에 더하기
    else:
        for j in range(0, len(plus_list), 2):
            ans += plus_list[j] * plus_list[j+1]
    
    # 음수 계산(0 포함)
    # 음수의 개수가 홀수라면 제일 작은 값을 정답에 더하기
    if len(minus_list) % 2 == 1:
        ans += minus_list[len(minus_list)-1]
        for j in range(0, len(minus_list)-1, 2):
            ans += (minus_list[j]) * (minus_list[j+1])
    # 음수의 개수가 짝수면 두 수를 곱하고 정답에 더하기
    else:
        for j in range(0, len(minus_list), 2):
            ans += (minus_list[j]) * (minus_list[j + 1])
    
    # 수 1에 대한 계산
    for j in range(len(one_list)):
        ans += one_list[j]
    
    # 정답 출력
    print(ans)
    
     
    採点結果

     
    良い解決策の事件源の結果

     
    リファレンス
  • https://data-flower.tistory.com/44