๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ Algorithm/์•Œ๊ณ ๋ฆฌ์ฆ˜-Swift

[์•Œ๊ณ ๋ฆฌ์ฆ˜/Swift] ํ•ด์‹œ - ๋ฒ ์ŠคํŠธ์•จ๋ฒ”

by Danna 2021. 7. 6.
728x90
728x90

Swift ์Šคํ„ฐ๋”” 11์ฃผ์ฐจ - ํ•ด์‹œ :: ์œ„์žฅ, ๋ฒ ์ŠคํŠธ์•จ๋ฒ”

 

[์•Œ๊ณ ๋ฆฌ์ฆ˜/Swift] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ์œ„์žฅ (ํ•ด์‹œ)

Python3 ๋กœ ํ’€์—ˆ๋˜ ๋ฌธ์ œ๋ฅผ Swift ๋กœ ๋‹ค์‹œ ํ’€์–ด๋ดค์–ด์š”. iOS ๊ฐœ๋ฐœ์„ ์ข€๋” ํšจ์œจ์ ์œผ๋กœ ํ•˜๊ธฐ์œ„ํ•ด์„œ Swift ๋ฐ์ดํ„ฐ๊ตฌ์กฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๋ถ€์˜ ํ•„์š”์„ฑ์„ ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค. ๐Ÿค” '์œ„์žฅ' ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์€ ์ด์ „ ํฌ

jellysong.tistory.com

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ํ•ด์‹œ - ๋ฒ ์ŠคํŠธ์•จ๋ฒ”

๐Ÿ‘€ ์ฒซ๋ฒˆ์งธ ํ’€์ด

# ๋”•์…”๋„ˆ๋ฆฌ ํ˜•ํƒœ

  • playDict ๋Š” ["์žฅ๋ฅด" : (์ด ์žฌ์ƒ๊ณก์ˆ˜, [์žฌ์ƒ๊ณก์ˆ˜])] ํ˜•ํƒœ์˜ ๋”•์…”๋„ˆ๋ฆฌ์ด๋‹ค.
  • ๊ฐ™์€ ์žฅ๋ฅด์˜ ์ด ์žฌ์ƒ๊ณก์ˆ˜์— ๋”ฐ๋ผ 1์ฐจ ์ •๋ ฌ์„ ํ•ด์ค˜์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด ์žฌ์ƒ๊ณก์ˆ˜๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ์ €์žฅํ–ˆ๋‹ค.
  • musicDict ๋Š” ["์žฅ๋ฅด_์žฌ์ƒ๊ณก์ˆ˜" : [๊ณ ์œ ๋ฒˆํ˜ธ]] ํ˜•ํƒœ์˜ ๋”•์…”๋„ˆ๋ฆฌ์ด๋‹ค.
  • ๊ฐ™์€ ์žฅ๋ฅด์— ๊ฐ™์€ ์žฌ์ƒ๊ณก์ˆ˜๋ฅผ ๊ฐ€์ง„ ๋…ธ๋ž˜๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ณ ์œ ๋ฒˆํ˜ธ๋ฅผ ๋ฐฐ์—ด๋กœ ์ €์žฅํ–ˆ๋‹ค.
playDict = {
  "์žฅ๋ฅด1" : {
    ์ด ์žฌ์ƒ ์ˆ˜ : 1300,
    ์žฌ์ƒ ์ˆ˜ : [500, 500, 300]
  },
  "์žฅ๋ฅด2" : { ... }
}

musicDict = {
  "์žฅ๋ฅด1_500" : [0, 1],
  "์žฅ๋ฅด1_300" : [2],
  ...
}

 

# ๋ฒ ์ŠคํŠธ ์•จ๋ฒ”์„ ๋ชจ์„๋•Œ์—๋Š” ๋‹ค์Œ ์ˆœ์„œ๋กœ ๋™์ž‘ํ•œ๋‹ค.

  1. playDict ์˜ ์š”์†Œ๋“ค์„ ์ด ์žฌ์ƒ๊ณก์ˆ˜์— ๋”ฐ๋ผ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.
  2. playDict ์˜ ๊ฐ ์š”์†Œ์˜ [์žฌ์ƒ๊ณก์ˆ˜] ๋ฅผ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.
  3. ์œ„ ๊ณผ์ •์„ ํ†ตํ•ด musicDict ์˜ ํ‚ค๊ฐ’์ธ "์žฅ๋ฅด_์žฌ์ƒ๊ณก์ˆ˜" ํ˜•ํƒœ๋กœ ๋งŒ๋“  ํ›„, [๊ณ ์œ  ๋ฒˆํ˜ธ]๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.
  4. 2-3๋ฒˆ์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ ๊ฐ ์žฅ๋ฅด๋งˆ๋‹ค ์ตœ๋Œ€ 2๊ฐœ์˜ ๋…ธ๋ž˜๋ฅผ ๋ฒ ์ŠคํŠธ ์•จ๋ฒ”์— ์ถ”๊ฐ€ํ•œ๋‹ค.
func solution(_ genres:[String], _ plays:[Int]) -> [Int] {
    var playDict = [String: (total: Int, each: [Int])]()
    var musicDict = [String: [Int]]()

    for i in 0..<genres.count {
        if playDict.keys.contains(genres[i]) {
            playDict[genres[i]]!.total += plays[i]
            playDict[genres[i]]!.each.append(plays[i])
        } else {
            playDict[genres[i]] = (total: plays[i], each: [plays[i]])
        }

        let key = genres[i] + String(plays[i])
        if musicDict.keys.contains(key) {
            musicDict[key]!.append(i)
        } else {
            musicDict[key] = [i]
        }
    }

    var bestMusics = [Int]()
    for (k, value) in playDict.sorted(by: { $0.value.total > $1.value.total }) {
        var count = 0
        for play in value.each.sorted(by: >) {
            let key = k + String(play)
            for music in musicDict[key]!.sorted() {
                guard count < 2 else { break }
                bestMusics.append(music)
                count += 1
            }
        }
    }

    return bestMusics
}

 

๐Ÿค” ๋‘๋ฒˆ์งธ ํ’€์ด

  • ์ฒซ๋ฒˆ์งธ ํ’€์ด์—์„œ playDict, musicDict ๋‘ ๊ฐœ์˜ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์“ฐ๋Š” ๊ฒƒ์„ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๋ฉด ์ข‹๊ฒ ๋‹ค ์‹ถ์–ด, ๊ณ ๋ฏผํ•ด๋ดค๋‹ค. 
  • JSON ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„๋•Œ์ฒ˜๋Ÿผ ๋”•์…”๋„ˆ๋ฆฌ ์•ˆ์— ๋”•์…”๋„ˆ๋ฆฌ ํ˜•ํƒœ๋กœ ๊ณ ๋ คํ–ˆ๋‹ค. (์•„๋ž˜ ์ฐธ๊ณ .. ์ข€ ํ‹€๋ ธ์„ ์ˆ˜๋„ ์žˆ๋‹ค) 
  • ๊ทธ์น˜๋งŒ 2์ค‘ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๊ตฌํ˜„ํ•˜๋ ค๋‹ˆ ์š”์†Œ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ด ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ณ , ์ฒซ๋ฒˆ์งธ ํ’€์ด๋ณด๋‹ค ์‹œ๊ฐ„์ด ์ข€ ๋” ๊ฑธ๋ ธ๋‹ค.

 

# ๋”•์…”๋„ˆ๋ฆฌ ํ˜•ํƒœ

  • ๋จผ์ €, Play ๋Š” ๊ฐ ์žฅ๋ฅด๋งˆ๋‹ค ํ•„์š”ํ•œ ๊ฐ’๋“ค์„ ์ €์žฅํ•˜๋Š” (์ด ์žฌ์ƒ์ˆ˜, [์žฌ์ƒ์ˆ˜: [๊ณ ์œ ๋ฒˆํ˜ธ]]) ํ˜•ํƒœ์˜ ํŠœํ”Œ์ด๋‹ค.
  • musics ๋Š” [์žฅ๋ฅด: Play] ํ˜•ํƒœ์˜ ๋”•์…”๋„ˆ๋ฆฌ์ด๋‹ค.  
  • ํ•œ๋ฒˆ์— ํ™•์ธํ•ด๋ณด๋ฉด musics ๋Š” [์žฅ๋ฅด:(์ด ์žฌ์ƒ์ˆ˜, [์žฌ์ƒ์ˆ˜: [๊ณ ์œ ๋ฒˆํ˜ธ]])] ์ธ ๊ฒƒ์ด๋‹ค.
musics = { 
  "์žฅ๋ฅด1" : 
    {
      "์ด ์žฌ์ƒ์ˆ˜" : 1300
      "๊ฐ ์žฌ์ƒ์ˆ˜" : [
        { 300 : [0] }, 
        { 500 : [1, 2] }
      ]
    }
  "์žฅ๋ฅด2" : { ... }
}

 

# ๋ฒ ์ŠคํŠธ ์•จ๋ฒ”์„ ๋ชจ์„๋•Œ์—๋Š” ๋‹ค์Œ ์ˆœ์„œ๋กœ ๋™์ž‘ํ•œ๋‹ค.

  1. musics ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์ „์ฒด ์žฌ์ƒ ์ˆ˜์— ๋”ฐ๋ผ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•œ๋‹ค.
  2. musics ๋”•์…”๋„ˆ๋ฆฌ ์š”์†Œ์˜ value ์ธ (total: ์ „์ฒด์žฌ์ƒ์ˆ˜, each: [์žฌ์ƒ ์ˆ˜: [๊ณ ์œ ๋ฒˆํ˜ธ]]) ์ด๋‹ค.
  3. value.each ์ธ [์žฌ์ƒ ์ˆ˜: [๊ณ ์œ ๋ฒˆํ˜ธ]] ๋ฅผ ์žฌ์ƒ ์ˆ˜์— ๋”ฐ๋ผ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•œ๋‹ค.
  4. [๊ณ ์œ ๋ฒˆํ˜ธ] ๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•ด์„œ, bestMusics ๋ฐฐ์—ด์— ์ตœ๋Œ€ 2๊ฐœ๋งŒํผ ๋„ฃ์–ด์ค€๋‹ค. 
func solution(_ genres:[String], _ plays:[Int]) -> [Int] {
    // [์žฅ๋ฅด: (์ „์ฒด์žฌ์ƒ์ˆ˜, [์žฌ์ƒ์ˆ˜:[๊ณ ์œ ๋ฒˆํ˜ธ]])]
    typealias Play = (total: Int, ids: [Int:[Int]])
    var musics = [String:Play]()

    for i in 0..<genres.count {
        let key = genres[i], play = plays[i]
        if musics.keys.contains(key) {
            musics[key]!.total += play
            if musics[key]!.ids.keys.contains(play) {
                musics[key]!.ids[play]!.append(i)
            } else {
                musics[key]!.ids[play] = [i]
            }
        } else {
            musics[key] = Play(total: play, ids: [play: [i]])
        }
    }

    var bestMusics = [Int]()
    for (_, value) in musics.sorted(by: { $0.value.total > $1.value.total }) {
        var count = 0
        for (_, ids) in value.ids.sorted(by: {$0.key > $1.key}) {
            for id in ids {
                guard count < 2 else { break }
                bestMusics.append(id)
                count += 1
            }
        }
    }

    return bestMusics
}

Review :: ์—„์ฒญ๋‚œ ์‹œ๊ฐ„์ฐจ์ด๊ฐ€ ๋‚˜๋Š” ๊ฑด ์•„๋‹ˆ์ง€๋งŒ, ํ’€์ด1๊ณผ ํ’€์ด2์ค‘์— ์–ด๋–ค๊ฒŒ ๋” ๋ณด๊ธฐ์ข‹์€ ํ’€์ด์ธ์ง€ ๊ตฌ๋ถ„ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค.. 

์ฒซ๋ฒˆ์งธ ํ’€์ด vs ๋‘๋ฒˆ์งธ ํ’€์ด 

728x90
728x90