๐Ÿ“– Problem Solution/Programmers

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

Fomagran ๐Ÿ’ป 2020. 12. 10. 23:49
728x90
๋ฐ˜์‘ํ˜•

Source Code


import Foundation
func solution(_ genres:[String], _ plays:[Int]) -> [Int] {
//์žฅ๋ฅด์™€ ์žฅ๋ฅด์˜ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์งˆ ๋”•์…”๋„ˆ๋ฆฌ
var genresAndPlays = [String:[Int]]()
//์žฅ๋ฅด์™€ ์žฅ๋ฅด ํ”Œ๋ ˆ์ด ํ† ํƒˆ์˜ ์ˆ˜๋ฅผ ๊ฐ€์งˆ ๋”•์…”๋„ˆ๋ฆฌ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐฐ์—ด
var total = [[String:Int]]()
//์ •๋‹ต ๋ฐฐ์—ด
var answer = [Int]()
//play์•ˆ์„ ํƒ์ƒ‰ํ•ด์ค๋‹ˆ๋‹ค.
for (current,play) in plays.enumerated() {
//์žฅ๋ฅด์•ˆ์— ํ˜„์žฌ ์ธ๋ฑ์Šค๋ฅผ key๋กœ ํ•ฉ๋‹ˆ๋‹ค.
let key = genres[current]
//๋งŒ์•ฝ genresAndPlays๊ฐ€ nil์ด๋ผ๋ฉด
if genresAndPlays[key] == nil {
//ํ˜„์žฌ genresAndPlays์— ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.
genresAndPlays[key] = [current]
//total์—๋Š” ์ƒˆ๋กœ์šด key์™€ play์‹œ๊ฐ„์„ ๊ฐ€์ง€๋Š” ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.
total.append([key:play])
continue
}
//genresAndPlays๋ฅผ ํƒ์ƒ‰ํ•ด์ค๋‹ˆ๋‹ค.
for (j,index) in genresAndPlays[key]!.enumerated() {
//๋งŒ์•ฝ ํ˜„์žฌ ์ธ๋ฑ์Šค์˜ play๊ฐ€ genresAndPlays[key]์•ˆ์— ์žˆ๋Š” play๋ณด๋‹ค ํฌ๋‹ค๋ฉด
if plays[index] < plays[current] {
//๊ทธ ์ž๋ฆฌ์— ์‚ฝ์ž…ํ•ด์ค๋‹ˆ๋‹ค.
genresAndPlays[key]?.insert(current, at: j)
//๋งŒ์•ฝ genresAndPlays[key]์˜ ์ˆ˜๊ฐ€ 2๋ณด๋‹ค ํฌ๋‹ค๋ฉด
if genresAndPlays[key]!.count > 2 {
//๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๋ฅผ ์‚ญ์ œํ•ด์ค๋‹ˆ๋‹ค.
genresAndPlays[key]?.removeLast()
}
break
//๋งŒ์•ฝ ํ˜„์žฌ ์ธ๋ฑ์Šค์˜ play๊ฐ€ genresAndPlays[key]์•ˆ์— ์žˆ๋Š” play๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฉด
}else{
//๋งŒ์•ฝ genresAndPlays[key]๊ฐ€ 2๋ณด๋‹ค ์ž‘๋‹ค๋ฉด
if genresAndPlays[key]!.count < 2 {
//๊ฐ€์žฅ ๋’ค์— ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.
genresAndPlays[key]?.append(current)
}
}
}
//total์˜ ๋”•์…”๋„ˆ๋ฆฌ ์ค‘ ํ˜„์žฌ key๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋”•์…”๋„ˆ๋ฆฌ๊ฐ€ ์žˆ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ฐพ์•„์ค๋‹ˆ๋‹ค.
let tIndex = total.firstIndex { (dictionary) -> Bool in
dictionary.first?.key == key
}
//์ฐพ์€ ์ธ๋ฑ์Šค์—์„œ key๊ฐ€ ์žˆ๋Š” ๊ณณ์— play๋ฅผ ๋”ํ•ด์ค๋‹ˆ๋‹ค.
total[tIndex!][key]! += play
}
//total์€ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ํ•˜๋‚˜์”ฉ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐฐ์—ด์ด๋ฏ€๋กœ ๊ฐ ๋”•์…”๋„ˆ๋ฆฌ์˜ ๋ฐธ๋ฅ˜๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ํฐ ๊ฐ’์œผ๋กœ ์ •๋ ฌํ•ด์ค๋‹ˆ๋‹ค.
let song = total.sorted {$0.first!.value > $1.first!.value}
//ํ† ํƒˆ์ˆ˜๋Œ€๋กœ ๋ฐ˜๋ณตํ•ด์ค๋‹ˆ๋‹ค.
for i in 0...total.count-1 {
//answer์— genresAndPlays์˜ song์˜ ์ฒซ๋ฒˆ์งธ key๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ธ๋ฑ์Šค๋“ค์„ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.
answer.append(contentsOf: genresAndPlays[song[i].first!.key]!)
}
//์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ค๋‹ˆ๋‹ค.
return answer
}

Solution


ํ•ด๋‹น ๋ฌธ์ œ๋Š” ํ•ด์‰ฌ๋ฌธ์ œ์˜€๋‹ค.(Swift๋กœ ๋”ฐ์ง€๋ฉด Dictionary๋ฅผ ์‚ฌ์šฉํ•ด ํ’€์–ด์•ผํ•˜๋Š” ๋ฌธ์ œ)

 

1. ๊ฐ ์žฅ๋ฅด๋ฅผ ํ‚ค๊ฐ’์œผ๋กœ ์žฅ๋ฅด๊ฐ€ ์žˆ๋Š” ์ธ๋ฑ์Šค๋ฅผ ๋ฐธ๋ฅ˜๊ฐ’์œผ๋กœ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋‹ด์•„์ค€๋‹ค.

 

2. 1์—์„œ ๋‹ด์€ ์ธ๋ฑ์Šค๋“ค์€ ํ”Œ๋ ˆ์ด ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ๊ฐ€์žฅ ํฐ 2๊ฐœ์˜ ์ธ๋ฑ์Šค๋งŒ ๋‹ด์•„์ค€๋‹ค.

 

3. ๊ฐ ์žฅ๋ฅด๋ฅผ ํ‚ค๊ฐ’์œผ๋กœ ํ•˜๊ณ  ๊ฐ ์žฅ๋ฅด์˜ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ํ”Œ๋ ˆ์ด ๊ฐ’์˜ ์ดํ•ฉ์„ ๋ฐธ๋ฅ˜๊ฐ’์œผ๋กœ ๊ฐ–๋Š” ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋‹ด์•„์ค€๋‹ค.

 

4. ์ดํ•ฉ์ด ๊ฐ€์žฅ ๋†’์€ ์ˆœ์œผ๋กœ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์ •๋ ฌํ•ด์ค€๋’ค ์ธ๋ฑ์Šค๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋ฐธ๋ฅ˜๊ฐ’๋“ค์„ ๊ฐ ์žฅ๋ฅด๋ณ„๋กœ ๋ชจ์•„์ค€ ๋‹ค์Œ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.

 

Problem


 

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๋ฒ ์ŠคํŠธ์•จ๋ฒ”

์ŠคํŠธ๋ฆฌ๋ฐ ์‚ฌ์ดํŠธ์—์„œ ์žฅ๋ฅด ๋ณ„๋กœ ๊ฐ€์žฅ ๋งŽ์ด ์žฌ์ƒ๋œ ๋…ธ๋ž˜๋ฅผ ๋‘ ๊ฐœ์”ฉ ๋ชจ์•„ ๋ฒ ์ŠคํŠธ ์•จ๋ฒ”์„ ์ถœ์‹œํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋ž˜๋Š” ๊ณ ์œ  ๋ฒˆํ˜ธ๋กœ ๊ตฌ๋ถ„ํ•˜๋ฉฐ, ๋…ธ๋ž˜๋ฅผ ์ˆ˜๋กํ•˜๋Š” ๊ธฐ์ค€์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์†ํ•œ ๋…ธ๋ž˜๊ฐ€

programmers.co.kr

์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ ๋œ ๊ฒƒ

 

๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๋‹ด์€๋ฐฐ์—ด์€ ์ธ๋ฑ์Šค๊ฐ€ ์—†๊ณ  ์ˆœ์„œ๋„ ๋žœ๋ค์œผ๋กœ ๋ฐฐ์น˜๋œ๋‹ค.

 

๊ณ ๋กœ ๋ฐฐ์—ด์— ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๋‹ด์•„์„œ ์ •๋ ฌ์„ ํ•ด์ฃผ์–ด์•ผ ๋œ๋‹ค.

 

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import Foundation
 
 
class Album {
    var index : Int
    var playTime : Int
 
    init(_ index : Int, _ playTime : Int) {
 
        self.index = index
        self.playTime = playTime
    }
}
 
func solution(_ genres:[String], _ plays:[Int]) -> [Int] {
 
    var albumDic = [String : [Album]]()
 
    plays
    .enumerated()
    .map     { (genres[$0], Album($0, $1)) }
    .forEach { albumDic[$0, default: [Album]() ].append($1) }
 
    return albumDic
    .sorted {
        $0.value.reduce(0, { $0 + $1.playTime }) > $1.value.reduce(0, { $0 + $1.playTime })
    }
    .map { _, albums -> [Intin
          guard albums.count > 1 else { return [albums[0].index] }
          let sorted = albums.sorted(by: { $0.playTime > $1.playTime} )
          return [sorted[0].index, sorted[1].index]}
    .reduce(into: [Int]()) { $0.append(contentsOf : $1) }
}

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ํšจ์œจ์„ฑ ๋น„๊ต

 

์ขŒ์ธก ๋‚ด ์ฝ”๋“œ ์šฐ์ธก ๋‹ค๋ฅธ ์‚ฌ๋žŒ ์ฝ”๋“œ

 

๊ทธ๋ž˜๋„ ์ด๋ฒˆ์—๋Š” ๋น„์Šท๋น„์Šทํ•˜๊ฒŒ ๋‚˜์™”๋‹ค.

728x90
๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€์ˆ˜0