๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ–ฅ CS/Algorithm

[Algorithm/Swift] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค(Lv.3) - ์ง•๊ฒ€๋‹ค๋ฆฌ ๊ฑด๋„ˆ๊ธฐ

์•ˆ๋…•ํ•˜์„ธ์š” ์ œ์ธ์ž…๋‹ˆ๋‹ค:) 

PS๋กœ ํ•˜๋ฃจ๋ฅผ ํž˜์ฐจ๊ฒŒ ์‹œ์ž‘ํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ ์ด์ œ ํ•  ์ผ์„ ์ข€ ํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ํ’€์–ด์•ผ๊ฒ ์–ด์š”...ใ…‡<-<

์˜ค๋Š˜ ์ €๋ฅผ ๊ดด๋กญํžŒ ๋ฌธ์ œ๋ฅผ ๋ณด์‹œ์ฃ  ์ง•๊ฒ€๋‹ค๋ฆฌ ๊ฑด๋„ˆ๊ธฐ ๋ ˆ์ญˆ๊ณ .

๋ฌธ์ œ ๋งํฌ

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

๋ฌธ์ œ ํ’€์ด

์ฒ˜์Œ ํ’€์ด

ํˆฌ ํฌ์ธํ„ฐ ํ™œ์šฉ (ํ…Œ์ŠคํŠธ์ผ€์ด์Šค ๋ชจ๋‘ ํ†ต๊ณผ, but ํšจ์œจ์„ฑ 0์ )

import Foundation

func solution(_ stones:[Int], _ k:Int) -> Int {
    var pointer1 = 0, pointer2 = k-1
    var max = Int.max // ๊ธธ์ด k์ธ ๊ตฌ๊ฐ„์—์„œ์˜ ์ตœ๋Œ“๊ฐ’ ์ €์žฅ

    while pointer2 < stones.count {
        let maxElement = stones[pointer1...pointer2].max()!
        if max > maxElement { max = maxElement }
    
        pointer1 += 1
        pointer2 += 1
    }

    return max
}

 

์ฒ˜์Œ์—๋Š” ํˆฌ ํฌ์ธํ„ฐ๋ฅผ ํ™œ์šฉํ•ด ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ๊ธฐ๋ฒ•์œผ๋กœ k๊ฐœ์˜ ๋””๋”ค๋Œ์„ ํ•œ ๊ตฌ๊ฐ„์œผ๋กœ ์„ค์ •ํ•ด์„œ ์ „์ฒด๋ฅผ ์Šค์บ”ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ’€์—ˆ์Šต๋‹ˆ๋‹ค.

์™œ๋ƒํ•˜๋ฉด, ์ง•๊ฒ€๋‹ค๋ฆฌ๋ฅผ ๋” ์ด์ƒ ๊ฑด๋„ˆ์ง€ ๋ชปํ•˜๊ฒŒ ๋˜๋Š” ์ˆœ๊ฐ„์€ ์ ํžŒ ์ˆซ์ž๊ฐ€ 0์ด ๋˜๋Š” ๋””๋”ค๋Œ์ด k๊ฐœ ์—ฐ๋‹ฌ์•„ ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ธธ์ด๊ฐ€ k์ธ ๊ตฌ๊ฐ„ ์•ˆ์—์„œ์˜ ์ตœ๋Œ“๊ฐ’์ด ํ•ด๋‹น ๊ตฌ๊ฐ„์„ ๊ฑด๋„ ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์˜ ์ตœ๋Œ€ ์ˆซ์ž๋ผ๋Š” ๊ฒƒ์„ ํŒŒ์•…ํ–ˆ๊ณ , ํ•ญ์ƒ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋Œ์„ ๋ฐŸ์•„์•ผ ํ•˜๋ฏ€๋กœ ํ•œ ์‚ฌ๋žŒ์ด ๊ฑด๋„ ๋•Œ๋งˆ๋‹ค ์ „์ฒด ๋Œ์˜ ์ˆซ์ž๊ฐ€ 1์”ฉ ๊ฐ์†Œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด ๋‹ค๋ฆฌ๋ฅผ ๊ฑด๋„ ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์˜ ์ตœ๋Œ€ ์ˆซ์ž๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•œ ๊ตฌ๊ฐ„ ๋‚ด์˜ ์ตœ๋Œ“๊ฐ’์„ ์ €์žฅํ•˜๋ฉด์„œ ๋” ์ž‘์€ ์ตœ๋Œ“๊ฐ’์ด ๋‚˜์˜ค๋ฉด ๊ฐฑ์‹ ํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•(์ตœ๋Œ“๊ฐ’๋“ค ์ค‘ ์ตœ์†Ÿ๊ฐ’์ด ์ตœ์ข… ๋‹ต)์œผ๋กœ ์ตœ์ข… ๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ์•„์ด๋””์–ด๋Š” ๋งž์•˜๋˜ ๊ฒƒ ๊ฐ™์€๋ฐ, ์ „์ฒด ๋‹ค๋ฆฌ๋ฅผ ์Šค์บ”ํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ตฌ๊ฐ„ ๋‚ด์˜ ์ตœ๋Œ“๊ฐ’์„ ์ฐพ๊ธฐ ์œ„ํ•ด ๋งค๋ฒˆ ์ „์ฒด ๋ฐฐ์—ด์„ k๋งŒํผ ์Šฌ๋ผ์ด์Šคํ•ด์„œ ๊ธธ์ด๊ฐ€ k์ธ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(k)๊ฐ€ ๋˜์–ด ์ „์ฒด ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ ๊ธธ๋‹ค๋ฉด ๋น„ํšจ์œจ์ ์ธ ํƒ์ƒ‰ ๋ฐฉ์‹์ด ๋ฉ๋‹ˆ๋‹ค. (์ด ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ stones ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ์ตœ๋Œ€ 200,000์ž…๋‹ˆ๋‹ค.)

 

ํšจ์œจ์„ฑ์„ ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ• ๊นŒ.. ํ•˜๋‹ค๊ฐ€ ์ด์ „์— ๋ฐฐ์—ด์— ์š”์†Œ๋ฅผ ๊ณ„์† ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด์„œ ์ตœ๋Œ“๊ฐ’ or ์ตœ์†Ÿ๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ์–ด์•ผ ํ•  ๋•Œ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ํ™œ์šฉํ•œ ๊ธฐ์–ต์ด ์žˆ์–ด์„œ ํž™์„ ๊ตฌํ˜„ํ•ด์„œ ๊ฐœ์„ ํ•ด๋ณด์ž! ๋ผ๋Š” ์•„์ด๋””์–ด๊ฐ€ ๋– ์˜ฌ๋ž์ง€๋งŒ, ์šฐ์„ ์ˆœ์œ„ ํ์˜ ํฌ๊ธฐ๋ฅผ ๊ณ„์† k๋กœ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ „์ฒด ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉฐ ์ƒˆ๋กœ์šด ๊ฐ’์„ insertํ•ด์ค„ ๋•Œ ๋ฐฐ์—ด์˜ ๋ฐ”๋กœ ์ด์ „ ์ธ๋ฑ์Šค์˜ ์š”์†Œ๋ฅผ ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ์‚ญ์ œํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ, ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ๋Š” ํŠน์ • ์›์†Œ๋ฅผ ์ฐพ์•„์„œ remove ์—ฐ์‚ฐ์„ ํ•ด์ค„ ์ˆ˜๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— (์šฐ์„ ์ˆœ์œ„ ํ์˜ ์›์†Œ๋Š” insert, removeํ•ด์ค„ ๋•Œ๋งˆ๋‹ค ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ๊ธฐ ๋•Œ๋ฌธ์— removeFirst()๋กœ๋Š” ์ด์ „ ์‚ฝ์ž… ๊ฐ’ ์‚ญ์ œ ๋ถˆ๊ฐ€) ์ด ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๊ฐœ์„ ํ•  ์ˆ˜ ์—†๊ฒ ๊ตฌ๋‚˜..๋ฅผ ๊นจ๋‹ซ๊ณ  ๋‹ค๋ฅธ ํ’€์ด๋ฅผ ์ฐพ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.. 

์ตœ์ข… ํ’€์ด

๋‹ค๋ฅธ ๋ธ”๋กœ๊ทธ๋“ค์˜ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ•œ ๊ฒฐ๊ณผ, ์ด๋ถ„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. (์ด๋ถ„ ํƒ์ƒ‰์€ ์ƒ๊ฐ์ง€๋„ ๋ชปํ–ˆ์–ด์š”)

๊ฑด๋„ ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์˜ ์ˆ˜๋ฅผ ๋ฐ˜์œผ๋กœ ์ค„์—ฌ๊ฐ€๋ฉด์„œ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ตœ์ ์˜ ํ•ด๋ฅผ ์ฐพ์•„๋‚ด๋Š” ๋ฐฉ์‹์ด์—ˆ๋Š”๋ฐ์š”, ์ด๋ถ„ ํƒ์ƒ‰์„ ์ด์šฉํ•œ ํ’€์ด ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1. left์™€ right๋ฅผ ๊ฐ๊ฐ stones ๋ฐฐ์—ด์˜ ์›์†Œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Ÿ๊ฐ’๊ณผ ์ตœ๋Œ€๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. (left = 1, right = 200000000)
2. mid๋ช…์˜ ์‚ฌ๋žŒ์ด ์ง•๊ฒ€๋‹ค๋ฆฌ๋ฅผ ๊ฑด๋„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ด…๋‹ˆ๋‹ค.
3-1. 2์˜ ๊ณผ์ •์—์„œ ๊ฑด๋„ ์ˆ˜ ์žˆ์œผ๋ฉด mid๋ช… ์ด์ƒ์˜ ๋ฒ”์œ„๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉด ๋˜๋ฏ€๋กœ left ๊ฐ’์„ mid+1๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
3-2. 2์˜ ๊ณผ์ •์—์„œ ๊ฑด๋„ ์ˆ˜ ์—†๋‹ค๋ฉด right ๊ฐ’์„ mid๋ช… ์ดํ•˜์˜ ๋ฒ”์œ„๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉด ๋˜๋ฏ€๋กœ mid๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
4. ๊ฑด๋„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ช…์ˆ˜๋ฅผ ๊ตฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ, left < right ์ธ ๋™์•ˆ ์œ„์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค. 

Swift ํ’€์ด ์ฝ”๋“œ

import Foundation

func solution(_ stones:[Int], _ k:Int) -> Int {
    var left = 1
    var right = 200000000
    
    while left < right {
        let mid = (left + right) / 2
        var skipCount = 0 // ๊ฑด๋„ˆ๋›ฐ์–ด์•ผํ•˜๋Š” ๋Œ์˜ ๊ฐœ์ˆ˜
        
        for i in 0..<stones.count {
            if stones[i] - mid <= 0 { // ์ ์ˆ˜ 0 ์ดํ•˜๋กœ ๋–จ์–ด์ง€๋Š” ๊ณณ ์ƒ๊ธฐ๋ฉด
                skipCount += 1
                
                if skipCount >= k { // ์ ์ˆ˜ 0๋˜๋Š” ๊ณณ์ด ์—ฐ๋‹ฌ์•„ k๊ฐœ ์ด์ƒ ๋‚˜์˜ค๋ฉด
                    break // ๋ฐ˜๋ณต๋ฌธ ํƒˆ์ถœ
                }
            } else { // mid๋ช…๋งŒํผ ๊ฑด๋„ ์ˆ˜ ์žˆ์œผ๋ฉด
                skipCount = 0 // skipCount ์ดˆ๊ธฐํ™”
            }
        }
        
        // ๊ฐ€๋Šฅ ์—ฌ๋ถ€์— ๋”ฐ๋ผ left, right ๋‹ค์‹œ ์„ค์ •
        if skipCount >= k { // mid๋ช… ๊ฑด๋„ ์ˆ˜ ์—†์œผ๋ฉด mid๋ช… ์ดํ•˜์˜ ๋ฒ”์œ„๋ฅผ ํƒ์ƒ‰
            right = mid
        } else { // mid๋ช… ๊ฑด๋„์ˆ˜ ์žˆ์œผ๋ฉด mid๋ช… ์ด์ƒ์˜ ๋ฒ”์œ„๋ฅผ ํƒ์ƒ‰
            left = mid + 1
        }
    }
 
    return left
}

 


[์ฐธ๊ณ  ์ž๋ฃŒ]

 

[Swift ์•Œ๊ณ ๋ฆฌ์ฆ˜] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค(Lv.3) - ์ง•๊ฒ€๋‹ค๋ฆฌ ๊ฑด๋„ˆ๊ธฐ / 2019 ์นด์นด์˜ค ์ธํ„ด์‹ญ

์•ˆ๋…•ํ•˜์„ธ์š”. ๊ฐœ๋ฐœ ์ค‘์ธ ์ •์ฃผ์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ "ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค(Lv.3) - ์ง•๊ฒ€๋‹ค๋ฆฌ ๊ฑด๋„ˆ๊ธฐ" ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ์Šต๋‹ˆ๋‹ค. Github GitHub - jeongju9216/SwiftAlgorithm: ์Šค์œ„ํ”„ํŠธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์Šค์œ„ํ”„ํŠธ ์•Œ๊ณ ๋ฆฌ์ฆ˜. Contribute to jeongju9

jeong9216.tistory.com

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค: ์ง•๊ฒ€๋‹ค๋ฆฌ ๊ฑด๋„ˆ๊ธฐ - Swift

https://school.programmers.co.kr/learn/courses/30/lessons/64062์ง•๊ฒ€๋‹ค๋ฆฌ๋ฅผ ๊ฑด๋„์ˆ˜ ์žˆ๋Š” ์นœ๊ตฌ๋“ค์˜ ์ˆ˜๋กœ ์ด๋ถ„ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ๊ฐ„๋‹จํžˆ ํ’€ ์ˆ˜ ์žˆ๋‹ค

velog.io

 

[์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์ง•๊ฒ€๋‹ค๋ฆฌ ๊ฑด๋„ˆ๊ธฐ

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์ง•๊ฒ€๋‹ค๋ฆฌ ๊ฑด๋„ˆ๊ธฐ ํ’€์ด

facerain.club