ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ํŒŒ์ผ๋ช… ์ •๋ ฌ(Swift)

2022. 10. 21. 14:09ใ†ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค-Swift

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ํŒŒ์ผ๋ช… ์ •๋ ฌ(Swift)

 

 

 ๋ฌธ์ œ ์„ค๋ช…

 

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

 

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

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

programmers.co.kr

 

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

 

numFlag์™€ tailFalg๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ๋ฐฐ์—ด์„ ์ชผ๊ฐฐ์ง€๋งŒ ๋ณ„๋กœ ์ข‹์€๋ฐฉ๋ฒ•์€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ •๋ ฌ์„ ํ•  ๋•Œ ์ฒ˜์Œ์—๋Š” ์‚ผํ•ญ์—ฐ์‚ฐ์ž ์•ˆ์— $0.head < $1.head ? $0.head < $1.head : ๋‚˜๋จธ์ง€๋กœ์ง ์ด๋Ÿฐ์‹์œผ๋กœ ์ž‘์„ฑํ–ˆ๋Š”๋ฐ ์ด๋Š” ์ฒซ๋ฒˆ์งธ $0.head < $1.head๋Š” ๋‹จ์ˆœํžˆ ์•ž์—๊ฒƒ์ด ๋’ค์—๊ฒƒ๋ณด๋‹ค ํฌ๋‹ค๋ฉด ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๊ตฌํ•˜์ง€์•Š์•„์„œ !=์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ์—ˆ๋‹ค.

 

struct Image {
    let head: String
    let number: String
    let tail: String
}
func solution(_ files:[String]) -> [String] {
    var images: [Image] = []
    for file in files {
        var numFlag = false
        var tailFlag = false
        var head: String = ""
        var num: String = ""
        var tail: String = ""
        
        let arr = Array(file)
        
        for x in arr {
            if !x.isNumber && !numFlag {
                head += String(x)
            } else if x.isNumber && !tailFlag {
                numFlag = true
                num += String(x)
            } else {
                tail += String(x)
                tailFlag = true
            }
        }
        let image = Image(head: head, number: num, tail: tail)
        images.append(image)
        
        
    }
    let b = images.sorted { $0.head.lowercased() != $1.head.lowercased() ? $0.head.lowercased() < $1.head.lowercased() : Int($0.number)! < Int($1.number)! }
    
    return b.map{
        let str = $0.head + String($0.number) + $0.tail
        return str
    }
 
}

 

 

 ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

 

prefix(while:) ๊ณผ drop(while:)์„ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋‹ค.

prefix(while:)์€ ์กฐ๊ฑด์ด true์ธ ๋™์•ˆ์˜ prefix๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰ ์กฐ๊ฑด์ด false๊ฐ€ ๋˜๋ฉด prefix๊ฐ€ ๋ฉˆ์ถ˜๋‹ค.

drop(while:)์€ ์กฐ๊ฑด์ด true์ผ๋•Œ ๊ฐ’๋“ค์„ ์ง€์šฐ๊ณ  false๊ฐ€ ๋˜๋Š” ์ˆœ๊ฐ„ ๊ทธ ๋’ค์— ๊ฐ’๋“ค์€ ์กฐ๊ฑด์— ๊ฑธ๋ฆฌ์ง€ ์•Š๊ณ  ์ „์ฒด๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

์ฆ‰

let str = "foo010bar020.zip"๋ผ๋Š” ๋ฌธ์ž์—ด์ด ์žˆ์„๋•Œ foo๋ฅผ ์ง€์šฐ๊ณ  010bar020.zip์ด ๋ฆฌํ„ด๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  sortํ•˜๋Š” ๋ถ€๋ถ„์—์„œ๋Š” head์˜ ์ด๋ฆ„๋„ ๊ฐ™๊ณ  number์˜ ์ด๋ฆ„๋„ ๊ฐ™์„ ๋•Œ๋Š” false๋ฅผ ์คฌ๋Š”๋ฐ ์ด์œ ๋Š” ์ž…๋ ฅ๊ฐ’ ์ˆœ์„œ๋Œ€๋กœ ๋ฆฌํ„ด์„ ํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ˆซ์ž๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š๋„๋ก ํ–ˆ๋‹ค.

 

struct Word {
    let head: String
    let number: String
    let index: Int
}

func makeWord(_ str: String, _ idx: Int) -> Word {
    let head = str.prefix{ !$0.isNumber }.lowercased()
    let num = str.drop{ !$0.isNumber }.prefix{ $0.isNumber }
    return Word(head: head, number: String(num), index: idx)
}

func AsortB(_ lhs: Word, _ rhs: Word) -> Bool {
    let aNum = Int(lhs.number)!, bNum = Int(rhs.number)!
    if lhs.head != rhs.head { return lhs.head < rhs.head }
    if aNum != bNum { return aNum < bNum }
    return false
}


func solution(_ files:[String]) -> [String] {
    var words: [Word] = []
    
    for (i, file) in files.enumerated() {
        words.append(makeWord(file, i))
    }
    
    words.sort { AsortB($0, $1) }
    let result = words.map{ files[$0.index] }
    
    return result
 
}