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],
...
}
# ๋ฒ ์คํธ ์จ๋ฒ์ ๋ชจ์๋์๋ ๋ค์ ์์๋ก ๋์ํ๋ค.
- playDict ์ ์์๋ค์ ์ด ์ฌ์๊ณก์์ ๋ฐ๋ผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค.
- playDict ์ ๊ฐ ์์์ [์ฌ์๊ณก์] ๋ฅผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค.
- ์ ๊ณผ์ ์ ํตํด musicDict ์ ํค๊ฐ์ธ "์ฅ๋ฅด_์ฌ์๊ณก์" ํํ๋ก ๋ง๋ ํ, [๊ณ ์ ๋ฒํธ]๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค.
- 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" : { ... }
}
# ๋ฒ ์คํธ ์จ๋ฒ์ ๋ชจ์๋์๋ ๋ค์ ์์๋ก ๋์ํ๋ค.
- musics ๋์ ๋๋ฆฌ๋ฅผ ์ ์ฒด ์ฌ์ ์์ ๋ฐ๋ผ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํ๋ค.
- musics ๋์ ๋๋ฆฌ ์์์ value ์ธ (total: ์ ์ฒด์ฌ์์, each: [์ฌ์ ์: [๊ณ ์ ๋ฒํธ]]) ์ด๋ค.
- value.each ์ธ [์ฌ์ ์: [๊ณ ์ ๋ฒํธ]] ๋ฅผ ์ฌ์ ์์ ๋ฐ๋ผ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํ๋ค.
- [๊ณ ์ ๋ฒํธ] ๋ฅผ ์ค๋ฆ์ฐจ์ ์ ๋ ฌํด์, 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์ค์ ์ด๋ค๊ฒ ๋ ๋ณด๊ธฐ์ข์ ํ์ด์ธ์ง ๊ตฌ๋ถํ๊ธฐ๊ฐ ์ด๋ ต๋ค..


728x90
728x90