Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Algorithm/Programmers

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] (Swift) ํฐ ์ˆ˜ ๋งŒ๋“ค๊ธฐ (lv.2, ๊ทธ๋ฆฌ๋””)

๊ฐ์ž ๐Ÿฅ” 2023. 2. 3. 19:48
๋ฐ˜์‘ํ˜•

๐ŸŸ  ๋ฌธ์ œ

https://school.programmers.co.kr/learn/courses/30/lessons/42883

 

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

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

programmers.co.kr

 

๐ŸŸ  ๋‚˜์˜ ํ’€์ด

๊ฐ€์žฅ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ž…๋ ฅ๋œ ์ˆœ์„œ ๊ทธ๋Œ€๋กœ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์ˆซ์ž๋ฅผ ์‚ญ์ œ์‹œํ‚ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ๋ฌด์กฐ๊ฑด ์ž‘์€ ์ˆซ์ž๋งŒ์„ ์ฐพ์•„์„œ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ž…๋ ฅ๋ฐ›์€ number์—์„œ ์ ์ ˆํ•œ ์œ„์น˜์— ์žˆ๋Š” ์ˆซ์ž๋“ค์„ ์‚ญ์ œํ•˜์—ฌ ๊ฐ€์žฅ ํฐ ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š”๊ฒŒ ํ•ต์‹ฌ์ด์—ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋‚ด๊ฐ€ ์บ์น˜ํ•ด๋‚ธ๊ฑด, ๋จผ์ € K๋ฒˆ์งธ ์ˆ˜๊นŒ์ง€ ๋น„๊ตํ•ด์„œ ๋งจ์•ž์ž๋ฆฌ์— ๊ฐ€์žฅ ์ ๋‹นํžˆ ํฐ ์ˆ˜๊ฐ€ ์˜ค๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š”๊ฒƒ.

๋จผ์ € ์ด๊ฒƒ์„ ํŒŒ์•…ํ–ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๊ฒŒ ๋˜๋ฉด, ์ด ์ดํ›„์˜ ์ˆซ์ž๋“ค์„ ๋น„๊ตํ•ด๊ฐ€๋ฉด์„œ ํฐ ์ˆ˜๋ฅผ ๋ฝ‘์•„์ฃผ๋Š”๊ฒŒ ์•„๋‹Œ๊ฐ€? ์‹ถ์—ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์งœ์•ผํ• ์ง€ ๋ง‰๋ง‰ํ–ˆ์ง€๋งŒ ์ผ๋‹จ ๋ง‰ ํ’€์ด๋ฅผ ์ƒ๊ฐํ•ด๋ดค๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์„ ์ด์ œ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ ค์„œ ์ฐพ์•„์ฃผ์–ด์•ผํ•˜๋Š”๋ฐ,,, ์ดˆ๋ฐ˜์— ์–ด๋–ป๊ฒŒ for๋ฌธ์„ ๋Œ๋ ค์•ผํ• ์ง€ ๋ง‰๋ง‰ํ–ˆ๋‹ค. ํ˜„์žฌ ์ธ๋ฑ์Šค๋กœ ์„ ํƒ๋œ ์นœ๊ตฌ ๊ทธ ๋‹ค์Œ๋ถ€ํ„ฐ ๋ด์•ผํ•˜๊ธฐ ๋Œ€๋ฌธ์— currentIdx์™€ nextIdx๋ฅผ ๋‘์–ด์„œ for๋ฌธ์„ ๋Œ๋ ค์ฃผ์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด 6์ž๋ฆฌ๊ฐ€ ๋‚˜์™€์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆซ์ž ์„ ํƒ๋„ for๋ฌธ์„ ์ด์šฉํ•ด์„œ 6๋ฒˆ๋งŒ ํ•ด์ฃผ๋ฉด ๋  ๊ฒƒ์ด๋ผ๊ณ  ํŒ๋‹จํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ์ƒ๊ฐ์„ ํ•˜๊ณ  ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.

โŒ ์ฒซ๋ฒˆ์งธ ํ’€์ด - ํ…Œ์ผ€ 10 ์‹œ๊ฐ„์ดˆ๊ณผ

๊ทธ๋ƒฅ ๋ƒ…๋‹ค ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ, ์ •๋‹ต์€ ๋งž์•˜์ง€๋งŒ ํ…Œ์ผ€ 10๋ฒˆ ํ•˜๋‚˜์—์„œ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚ฌ๋‹ค. ๋ญ ๋•Œ๋ฌธ์ผ๊นŒ ใ… ใ… 

import Foundation

func solution(_ number:String, _ k:Int) -> String {
    let numArr = number.map{ Int(String($0))! }
    var answer = [Int]()
    var nextIdx = 0
    var currentIdx = 0

    for i in 0..<number.count - k {
        var tempMax = -999

        for j in nextIdx...i+k {
            if tempMax < numArr[j] {
                tempMax = numArr[j]
                currentIdx = j
            }
        }

        answer.append(tempMax)
        nextIdx = currentIdx + 1
    }

    return answer.map{ String($0) }.joined()
}

์ผ๋‹จ ๋‚ด๊ฐ€ ์ง€๊ธˆ ์ง  ์ฝ”๋“œ๋Š” O(n^2)์ด๊ณ , ์ฃผ์–ด์ง€๋Š” nubmer๊ฐ€์žฅ ํฐ ์ˆ˜๊ฐ€ 100๋งŒ์ด๋‹ค. 100๋งŒx100๋งŒ์ด ๋œ๋‹ค๋ฉด, ๊ฑฐ์˜ 1์–ต ๊ฐ€๊นŒ์ด ๋˜๋Š” ๋งŒํผ for๋ฌธ์ด ๋Œ์•„๊ฐˆ ๊ฒƒ์ด๋‹ค. ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜๋ฏ€๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ O(n)์œผ๋กœ ์ค„์—ฌ์ฃผ๋Š” ํ’€์ด๊ฐ€ ํ•„์š”ํ•ด ๋ณด์ธ๋‹ค. 

๋ฏธ์ณ๋Œ์•„๊ฐ€๋„ค.. ์‹œ๊ฐ„์ดˆ๊ณผ......

 

โœ… ๋‘๋ฒˆ์งธ ํ’€์ด - stack์„ ์‚ฌ์šฉํ•œ ํ’€์ด (์ •๋‹ต์ฝ”๋“œ)

์ธํ„ฐ๋„ท์„ ์ฐธ๊ณ ํ–ˆ๋‹ค.... stack์„ ์‚ฌ์šฉํ•ด์„œ ํ’€์–ด๋ณด๋ผ๋Š” ์˜๊ฒฌ์ด ๋งŽ์•˜๋‹ค. ๊ทธ๋Ÿผ O(n)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋กœ ํ’€ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ–ˆ๋‹ค. ๋‚ด๊ฐ€ ์ง€๊ธˆ ํ‘ผ ํ’€์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ stack์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ ๋จธ๋ฆฌ๋ฅผ ๊ตด๋ ค๋ณด์•˜๋”ฐ. ... ...... .์–ด๋ ต๋„ค....... stack์„ ํ™œ์šฉํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋„๋Œ€์ฒด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด๋‚ธ๊ฑฐ์ง€? ๋‹ค๋“ค ๋˜‘๋˜‘ํ•˜๋‹ค... 

๋„๋Œ€์ฒด stack์„ ํ™œ์šฉํ•ด์„œ ํ‘ผ๋‹ค๋Š”๊ฒŒ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์•„์„œ ๋‹ค์–‘ํ•œ ์‚ฌ๋žŒ๋“ค์˜ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค. stack์„ ํ™œ์šฉํ•œ ํ’€์ด๋„ for์™€ while๋ฌธ์ด ์ค‘์ฒฉ๋˜๋Š”๋ฐ ์–ด๋Š ๋ถ€๋ถ„์—์„œ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ์ž‘์€๊ฑธ๊นŒ?

์Œ,, ๋‚ด์ƒ๊ฐ์—๋Š” ์ผ๋‹จ ๋‚ด ํ’€์ด๋Š” ๋ชจ๋“  ์ˆ˜๊ฐ€ ์ด์ค‘ for๋ฌธ์„ ๊ฑฐ์น˜๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ stack์„ ํ™œ์šฉํ•œ (์•„๋ž˜) ํ’€์ด๋Š” k๋งŒํผ ์ˆ˜๊ฐ€ ๋‹ค ์ง€์›Œ์กŒ๋‹ค๋ฉด, ๋‚จ์€ ์ˆ˜๋“ค์„ ๋ชจ์กฐ๋ฆฌ stack์— ๋„ฃ์–ด์คŒ์œผ๋กœ์จ ๋ฐ˜๋ณต๋ฌธ์ด ๋Œ์•„๊ฐ€๋Š” ํšŸ์ˆ˜๋ฅผ ์ตœ์†Œํ™”์‹œ์ผฐ๋‹ค. ์•„๋ฌด๋ž˜๋„ ์ด ๋ถ€๋ถ„์—์„œ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ์กฐ๊ธˆ ์ค„์–ด๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ์—ˆ์ง€ ์•Š์„๊นŒ ์‹ถ๋‹ค.

์ฝ”๋“œ ์„ค๋ช…์€ ์ฃผ์„์œผ๋กœ ๋‹ฌ์•„๋†จ๋‹ค.

func solution(_ number:String, _ k:Int) -> String {
    let numArr = number.map{ Int(String($0))! }
    var answer = [Int]()
    var newk = k

    for i in 0..<number.count {
        // ์•„์ง k๋ฒˆ๋งŒํผ ์•ˆ์ง€์›Œ์ก‹๊ณ , answe๊ฐ€ ๋น„์›Œ์ ธ์žˆ์ง€ ์•Š๊ณ , answer์˜ ๋งˆ์ง€๋ง‰์— ์žˆ๋Š” ๊ฐ’์ด ์ง€๊ธˆ ๋„ฃ์œผ๋ ค๋Š” ๊ฐ’๋ณด๋‹ค ์ž‘์œผ๋ฉด
        // answer์— ์žˆ๋Š” ๋งˆ์ง€๋ง‰ ๊ฐ’์„ ์ง€์›Œ๋ฒ„๋ฆฌ์„ธ์š”.
        while newk > 0, !answer.isEmpty, answer.last! < numArr[i] {
            answer.removeLast()
            newk -= 1
        }

        // ๋งŒ์•ฝ k๋ฒˆ๋งŒํผ ์ „๋ถ€ ์ง€์› ๋‹ค๋ฉด
        // answer์— ์ง€๊ธˆ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š์€ ๋‚จ์€ ๋’ค์—์žˆ๋Š” numArr๋ฅผ ๋ชจ๋‘ ๋„ฃ์–ด์ฃผ์„ธ์š”.
        // ๋งŒ์•ฝ k๋ฒˆ๋งŒํผ ์ „๋ถ€ ์ง€์šฐ์ง€ ์•Š์•˜๋‹ค๋ฉด
        // answer์— ์ง€๊ธˆ์˜ numArr[i]๋ฅผ ๋„ฃ์–ด์ฃผ์„ธ์š”.
        if newk <= 0 {
            answer.append(contentsOf: numArr[i...])
            break
        } else {
            answer.append(numArr[i])
        }
    }

    // prefix : ์•ž์—์„œ๋ถ€ํ„ฐ ์›ํ•˜๋Š” ๊ฐฏ์ˆ˜์˜ ์›์†Œ๋“ค๋งŒ ์ถœ๋ ฅํ•ด์ค€๋‹ค.
    // ์šฐ๋ฆฌ๋Š” number.count - k ์ž๋ฆฌ์ˆ˜๋ฅผ ์›ํ•ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋„ฃ์–ด์ค˜์•ผํ•œ๋‹ค.
    // number = 999 , k = 1 ์—์„œ answer์€ [9, 9, 9]๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์„œ ํ•œ๊ฐœ๋งŒ ์ถœ๋ ฅํ•ด์ค€๋‹ค. prefix์˜ ์—ญํ• 
    return String(answer.map{ String($0) }.joined().prefix(number.count-k))
}

 

 

 

์ฐธ๊ณ  ์ฝ”๋“œ - https://rldd.tistory.com/159?category=963241 

 

[Swift] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค LV2. ํฐ ์ˆ˜ ๋งŒ๋“ค๊ธฐ

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค LV2. ํฐ ์ˆ˜ ๋งŒ๋“ค๊ธฐ โœ… ์ด ๋ฌธ์ œ๋Š” ์ •๋ง ์˜ค๋žœ๊ธฐ๊ฐ„ ๋„์ „์„ ํ•˜์—ฌ ํ’€์–ด๋ƒˆ๋‹ค. (์ฒซ ๋„์ „) 2021/08/08 (๋‘๋ฒˆ์งธ ๋„์ „) 2021/11/18 (์„ธ๋ฒˆ์งธ ๋„์ „) 2022/04/13 ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๋ถ€ํ•˜๋‹ค๊ฐ€ ๊ท€์ฐฎ์•„์„œ ๊ณ„์† ๋ฏธ๋ค˜๊ณ ,

rldd.tistory.com

์ฐธ๊ณ  ์ฝ”๋“œ ๋ฐ ํ’€์ด - 

๋ฐ˜์‘ํ˜•