๐Ÿ“ Algorithm/์•Œ๊ณ ๋ฆฌ์ฆ˜

[์•Œ๊ณ ๋ฆฌ์ฆ˜] 01. ๋ˆ„์ ํ•ฉ with Swift

JINiOS 2023. 12. 23. 19:24
728x90

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

 

11659๋ฒˆ: ๊ตฌ๊ฐ„ ํ•ฉ ๊ตฌํ•˜๊ธฐ 4

์ฒซ์งธ ์ค„์— ์ˆ˜์˜ ๊ฐœ์ˆ˜ N๊ณผ ํ•ฉ์„ ๊ตฌํ•ด์•ผ ํ•˜๋Š” ํšŸ์ˆ˜ M์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” N๊ฐœ์˜ ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ˆ˜๋Š” 1,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. ์…‹์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์—๋Š” ํ•ฉ์„ ๊ตฌํ•ด์•ผ ํ•˜๋Š” ๊ตฌ๊ฐ„ i์™€ j

www.acmicpc.net

ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ๋ˆ„์ ํ•ฉ์„ ์ฒ˜์Œ ์ ‘ํ–ˆ๋‹ค. 

๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  ๊ฐ’์„ ๊ณ„์‚ฐํ•ด์„œ ์ €์žฅํ•ด์„œ ๊บผ๋‚ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์€ ๋“ค์—ˆ๋Š”๋ฐ, ์ •ํ™•ํ•œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์ด ๋ˆ„์ ‘ํ•ฉ!์ธ์ง€๋Š” ๋ชฐ๋ž๋‹ค..!

 

๋ˆ„์ ํ•ฉ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž!


๋ˆ„์ ํ•ฉ

ํŠน์ • ๊ตฌ๊ฐ„์˜ ํ•ฉ์„ ์ฐพ๋Š”๋ฐ ์œ ์šฉํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

๋ˆ„์ ํ•ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์—ฐ์†๋œ ์›์†Œ๋“ค์˜ ํ•ฉ์„ ๋น ๋ฅด๊ฒŒ ๊ณ„์‚ฐํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค. ๋ฐฐ์—ด๊ณผ ๊ฐ™์€ ์‹œํ€€์Šค ๋ฐ์ดํ„ฐ์—์„œ ์ผ๋ถ€ ๊ตฌ๊ฐ„์˜ ํ•ฉ์„ ์ฐพ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ „์ฒด ๋ฐฐ์—ด์„ ๋ฐ˜๋ณตํ•ด์„œ ๋ง์…ˆ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹๋ณด๋‹ค ๋น ๋ฅธ ๊ณ„์‚ฐ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

 

๋ˆ„์ ํ•ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž‘๋™ ๋ฐฉ์‹

  1. ๋ˆ„์  ๋ฐฐ์—ด ์ƒ์„ฑ: ์›๋ž˜์˜ ๋ฐฐ์—ด๊ณผ ๊ฐ™์€ ๊ธธ์ด๋ฅผ ๊ฐ–๋Š” ๋ฐฐ์—ด์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด ๋ฐฐ์—ด์˜ ๊ฐ ์ธ๋ฑ์Šค๋Š” ์›๋ž˜ ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๊นŒ์ง€์˜ ํ•ฉ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ˆ„์  ๋ฐฐ์—ด ๊ฐ’ ๊ฐฑ์‹ : ๋ˆ„์  ๋ฐฐ์—ด์„ ๊ตฌ์„ฑํ•  ๋•Œ, ๊ฐ ์›์†Œ๋Š” ํ•ด๋‹น ์ธ๋ฑ์Šค๊นŒ์ง€์˜ ํ•ฉ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ˆ„์  ๋ฐฐ์—ด์˜ i๋ฒˆ์งธ ํ•ญ๋ชฉ์€ ์›๋ž˜ ๋ฐฐ์—ด์˜ 0๋ฒˆ์งธ๋ถ€ํ„ฐ i๋ฒˆ์งธ๊นŒ์ง€์˜ ํ•ฉ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  3. ํŠน์ • ๊ตฌ๊ฐ„ ํ•ฉ ๊ณ„์‚ฐ: ๊ตฌ๊ฐ„[i, j]์˜ ํ•ฉ์€ ๋ˆ„์ ํ•ฉ[j]์—์„œ ๋ˆ„์ ํ•ฉ[i-1]์„ ๋นผ๋ฉด ์‰ฝ๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ์จ, ๋ฐฐ์—ด์˜ ํŠน์ • ๊ตฌ๊ฐ„์˜ ํ•ฉ์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„ ๋ณต์žก๋„ O(1)์— ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
func calculatePrefixSum(_ arr: [Int]) -> [Int] {
    var prefixSum = [Int](repeating: 0, count: arr.count)
    
    // ์ฒซ ๋ฒˆ์งธ ์›์†Œ๋Š” ์ž๊ธฐ ์ž์‹ ์ด๋ฏ€๋กœ ์›๋ž˜ ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”
    prefixSum[0] = arr[0]
    
    // ๋ˆ„์ ํ•ฉ ๋ฐฐ์—ด ๊ตฌ์„ฑ
    for i in 1..<arr.count {
        prefixSum[i] = prefixSum[i - 1] + arr[i]
    }
    
    return prefixSum
}

func cal(_ start: Int, _ end: Int) -> Int {
    if start == end { return arr[start] }
    if start == 0 { return prefixSumArray[end] }
    return prefixSumArray[end] - prefixSumArray[start-1]
}

// ์˜ˆ์‹œ ๋ฐฐ์—ด
let arr = [3, 1, 7, 5, 2, 4]

// ๋ˆ„์ ํ•ฉ ๊ณ„์‚ฐ
let prefixSumArray = calculatePrefixSum(arr)
print("๋ˆ„์ ํ•ฉ ๋ฐฐ์—ด: \(prefixSumArray)")

// ๊ตฌ๊ฐ„ ์ธ๋ฑ์Šค[2, 4]์˜ ํ•ฉ
let result = cal(2, 4) // ์ธ๋ฑ์Šค์— ์œ ์˜
728x90