본문 바로가기
파이썬 코딩테스트/해커랭크

HackerRank / The Maximum Subarray / Python

by S.T.Lee 2021. 12. 22.

https://www.hackerrank.com/challenges/maxsubarray/problem?isFullScreen=true

 

The Maximum Subarray | HackerRank

Given an array find the maximum possible sum of two types of subsequences.

www.hackerrank.com

#!/bin/python3

import math
import os
import random
import re
import sys

def maxSubarry(arr):
    maxSub = 0
    sum_list = []
    for ar in range(len(arr)):
        if maxSub + arr[ar] < 0: #합이 0보다 적어지는 순간
            sum_list.append(maxSub) #기존 합을 리스트에 저장
            maxSub = 0 #합을 0으로 초기화
        else:
            if arr[ar]<0: #합이 0보다 큰데 인자가 음수면
                sum_list.append(maxSub) #기존 합을 저장하고
                maxSub += arr[ar] #진행
            else:
                maxSub += arr[ar] #아니라면 진행
                
    sum_list.append(maxSub) #모두 양수인걸 대비해서 맨마지막에 저장
    sum_set = set(sum_list) #중복된거 없애주고
    if max(sum_set) == 0: #최대치가 0이라는 뜻은 arr이 전부 음수였다는 뜻(또는 0)
        return max(arr) #그러면 음수중 최대값을 돌려주고
    else:
        return max(sum_set) #아니라면 set안에서 최대값을 돌려주고

def maxSubsequence(arr):
    seq_sum = 0
    for ar in arr:
        if ar >0 : #양수인 값만 계속 더해주고
            seq_sum += ar
        else:
            pass
    if seq_sum > 0: #만약 합이 0보다 크면
        return seq_sum #그대로 돌려주고
    else: #아니라면 전부 음수였거나 0이거나
        return max(arr) #그중 최대값을 돌려주고
    
def maxSub(arr):
    # Write your code here
    MSA = maxSubarry(arr)
    MSS = maxSubsequence(arr)
    
    return [MSA, MSS]
        
    
if __name__ == '__main__':
    fptr = open(os.environ['OUTPUT_PATH'], 'w')

    t = int(input().strip())

    for t_itr in range(t):
        n = int(input().strip())

        arr = list(map(int, input().rstrip().split()))

        result = maxSub(arr)

        fptr.write(' '.join(map(str, result)))
        fptr.write('\n')

    fptr.close()