ν‹°μŠ€ν† λ¦¬ λ·°

728x90
λ°˜μ‘ν˜•

문제

 

1912번: 연속합

첫째 쀄에 μ •μˆ˜ n(1 ≤ n ≤ 100,000)이 주어지고 λ‘˜μ§Έ μ€„μ—λŠ” n개의 μ •μˆ˜λ‘œ 이루어진 μˆ˜μ—΄μ΄ 주어진닀. μˆ˜λŠ” -1,000보닀 ν¬κ±°λ‚˜ κ°™κ³ , 1,000보닀 μž‘κ±°λ‚˜ 같은 μ •μˆ˜μ΄λ‹€.

www.acmicpc.net

 

문제 풀이

 λ‹€μŒκ³Ό 같은 쑰건을 톡해, ν•œλ²ˆμ˜ κ³„μ‚°μœΌλ‘œ 연속합 μ€‘μ˜ μ΅œλŒ€ 값을 찾을 수 μžˆλ‹€. ν˜„μž¬ μˆ˜μ—΄ 값이 μ•žμ˜ κ°’κ³Ό λ”ν•œ 것 보닀 값이 크면 κ·ΈλŒ€λ‘œ μœ μ§€ν•˜κ³  아닐 경우, μ•žμ˜ ν•©μ‚° κ°’μœΌλ‘œ κ°±μ‹ ν•œλ‹€. λ§λ‘œλŠ” 잘 이해가 μ•ˆλ˜μ§€λ§Œ 문제 μ˜ˆμ‹œμ—μ„œ μ΅œλŒ€ 값을 κ΅¬ν•˜λŠ” 과정을 보면 μ‰½κ²Œ 이해할 수 μžˆλ‹€.

 

Origin 10 -4 3 1 5 6 -35 12 21
Round 1 10 6              
Round 2 10 6 9            
Round 3 10 6 9 10          
Round 4 10 6 9 10 15        
Round 5 10 6 9 10 15 21      
Round 6 10 6 9 10 15 21 -14    
Round 7 10 6 9 10 15 21 -14 12  
Round 8 10 6 9 10 15 21 -14 12 33
  • λˆ„μ λœ 값이 ν˜„μž¬ μˆ˜μ—΄ κ°’(인덱슀) 보닀 크닀면 λˆ„μ λœ μƒˆλ‘œμš΄ κ°’μœΌλ‘œ κ°±μ‹ ν•œλ‹€. (νŒŒλž€μƒ‰)
  • λˆ„μ λœ 값이 ν˜„μž¬ μˆ˜μ—΄ κ°’ 보닀 μž‘λ‹€λ©΄ ν˜„μž¬ 값을 μœ μ§€ν•œλ‹€ (빨간색)
  • 이와 같은 방식을 톡해 더 이상 값이 μ¦κ°€ν•˜μ§€ μ•ŠλŠ” 뢀뢄에 λŒ€ν•œ λΆ€λΆ„ν•©κ³Ό κ·Έ μ΄ν›„μ˜ 뢀뢄합을 계산할 수 μžˆλ‹€.

 

μ½”λ“œ

from sys import stdin

if __name__ == '__main__':
    n = int(stdin.readline())
    nums = list(map(int, stdin.readline().split()))

    for i in range(1, n):
        nums[i] = max(nums[i], nums[i - 1] + nums[i])

    print(max(nums))
728x90
λ°˜μ‘ν˜•
λŒ“κΈ€
κΈ€ 보관함
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€