πŸ’― | λ°±μ€€/πŸ™‚ | Silver

[Kotlin, S2] λ°±μ€€ 1912번 연속합

immgga 2024. 8. 26. 23:13
λ°˜μ‘ν˜•

좜처: unsplash.com

 

연속합(1912번)

Silver 2

#λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°

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

 

문제 λ‚΄μš©

 

 

문제 μ ‘κ·Ό

μ •μˆ˜λ“€μ΄ μ£Όμ–΄μ§€λ©΄, μ—°μ†λœ μ •μˆ˜μ˜ ν•© μ€‘μ˜ μ΅œλŒ“κ°’μ„ μ°Ύμ•„μ„œ 좜λ ₯ν•œλ‹€.

μ‹œκ°„μ œν•œμ΄ 1초이고, μ •μˆ˜λŠ” 10만 κ°œκΉŒμ§€ λ“€μ–΄μ˜€κΈ° λ•Œλ¬Έμ— λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°μ΄ κ°•μ œλœλ‹€.

이 문제λ₯Ό λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°μœΌλ‘œ ν’€κΈ° μœ„ν•΄μ„œλŠ” μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒ?

 

μž…λ ₯ 예제 1을 예둜 λ“€μ–΄ 보겠닀.

10
10 -4 3 1 5 6 -35 12 21 -1

μ •μˆ˜λ₯Ό ν•˜λ‚˜μ”© λ³΄λ©΄μ„œ μ΅œλŒ“κ°’μ„ μ°Ύμ•„λ³΄μž.

 

첫 번째 μˆ˜λŠ” 10이기 λ•Œλ¬Έμ— μ—°μ†λœ 수의 합은 10이닀.

두 번째 μˆ˜λŠ” -4이닀. μ—°μ†λœ 수의 합은 6이닀. 6κ³Ό -4쀑에 6이 더 크닀.

μ„Έ 번째 μˆ˜λŠ” 3이닀. μ—°μ†λœ 수의 합은 9이닀. 9와 3쀑에 9κ°€ 더 크닀.

λ„€ 번째 μˆ˜λŠ” 1이닀. μ—°μ†λœ 수의 합은 10이닀. 10κ³Ό 1쀑에 10이 더 크닀.

λ‹€μ„― 번째 μˆ˜λŠ” 5이닀. μ—°μ†λœ 수의 합은 15λ‹€. 15κ³Ό 5쀑에 15κ°€ 더 크닀.

μ—¬μ„― 번째 μˆ˜λŠ” 6이닀. μ—°μ†λœ 수의 합은 21이닀. 21κ³Ό 6쀑에 21이 더 크닀.

일곱 번째 μˆ˜λŠ” -35λ‹€. μ—°μ†λœ 수의 합은 -14이닀. -14와 -35쀑에 -14κ°€ 더 크닀.

μ—¬λŸ 번째 μˆ˜λŠ” 12이닀. μ—°μ†λœ 수의 합은 -2이닀. -2와 12쀑 12κ°€ 더 크닀. μ—°μ†λœ 수의 합을 12둜 λ³€κ²½ν•œλ‹€.

아홉 번째 μˆ˜λŠ” 21이닀. μ—°μ†λœ 수의 합은 33이닀. 33κ³Ό 21쀑 33이 더 크닀.

μ—΄ 번째 μˆ˜λŠ” -1이닀. μ—°μ†λœ 수의 합은 32이닀. 32와 -1쀑 32κ°€ 더 크닀.

 

총 10번의 탐색 κ²°κ³Όμ—μ„œ 정닡이 μžˆλ‹€. 정닡은 33이닀.

μœ„μ™€ 같은 λ°©μ‹μœΌλ‘œ 닡을 κ΅¬ν•˜λ©΄ μ΅œλŒ“κ°’μ΄ ν¬ν•¨λ˜μ–΄ μžˆλŠ” 리슀트λ₯Ό 얻을 수 μžˆλ‹€.

κ·Έ λ¦¬μŠ€νŠΈμ—μ„œ μ΅œλŒ“κ°’μ„ ꡬ해주면 λœλ‹€.

 

점화식은 λ‹€μŒκ³Ό 같이 κ΅¬μ„±ν•œλ‹€.

max(res[i - 1] + numbers[i], numbers[i])

resκ°€ ν˜„μž¬κΉŒμ§€μ˜ μ΅œλŒ“κ°’μ΄κ³ , numbersκ°€ μž…λ ₯받은 μ •μˆ˜λ“€μΌ λ•Œ, 두 수의 합이 μ—°μ†λœ 수의 합이닀.

μ—°μ†λœ 수의 ν•©κ³Ό μž…λ ₯ μ •μˆ˜ 쀑 더 큰 값을 μ°ΎλŠ”λ‹€.

 

 

문제 ν•΄κ²° μ½”λ“œ

더보기
import java.io.BufferedReader
import java.io.InputStreamReader
import kotlin.math.max

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val numberCnt = readLine().toInt()
    val numbers = readLine().split(" ").map { it.toInt() }
    val res = Array(numberCnt) { 0 }
    res[0] = numbers[0]

    for (i in 1 until numbers.size) {
        res[i] = max(res[i - 1] + numbers[i], numbers[i])
    }

    println(res.max())
}

 

문제 풀이

μž…λ ₯받은 μ •μˆ˜λ“€μ˜ μ΅œλŒ“κ°’μ„ res에 μ €μž₯ν•  것이닀. res의 초기 값인 0번째 값은 μž…λ ₯받은 μ •μˆ˜λ“€μ˜ 첫 번째 μ •μˆ˜λ‘œ μ§€μ •ν•œλ‹€.

그리고 λ°˜λ³΅ν•˜λ©΄μ„œ μ΅œλŒ“κ°’μ„ ꡬ해 μ€€λ‹€.

 

 

문제 ν•΄κ²° κ³Όμ •

ν‰λ²”ν•œ λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ° 문제.

일단 λ‚˜λŠ” μ²˜μŒμ— 점화식이 생각이 μ•ˆ λ‚˜μ„œ 문제 κ²Œμ‹œνŒμ„ μ°Έκ³ ν–ˆλ‹€.

μ–Έμ œμ―€ λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°μ„ λ§ˆμŠ€ν„°ν•  수 μžˆμ„κΉŒ?

728x90
λ°˜μ‘ν˜•