Swift랑 친해지기/programmers 풀기

[프로그래머스] 베스트앨범 (Swift)

데브킹덕 2023. 11. 14. 13:23

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

  • dic - 장르 : 총합재생수
  • dic2 - 장르 : [고유번호(인덱스)]
  • dic3 - 인덱스 : 재생수

1. dic의 value값을 비교하여 속한 노래가 많이 재생된 장르를 정렬한 배열을 생성 (sortOne)

 

2. sortOne의 값은 많이 재생된 장르의 순이므로 차례로 장르내에서 많이 재생된 노래를 판단해야함

  • d - 고유번호(인덱스) : 한 노래의 재생수 
  • d의 value 값(재생 수)을 이용해 비교함
  • sorted메서드를 이용하여 value값이 높은 순서대로 정렬 시키도록 하였음
  • Array<(key:value)>자료형이 반환되어 map메서드를 이용하여 key값으로 매핑
for i in sortOne{
    let a = dic2[i.key]! 
    var d: [Int:Int] = [:]
    for j in a{
        d[j] = dic3[j]
    }
    var arr = d.sorted{
        if $0.1 == $1.1{
            return $0.0 < $1.0
        }
        return $0.1 > $1.1
    }.map{$0.key}
}

3. 만약 장르내에서 재생횟수가 같은 노래중에서 고유 번호가 낮은 노래를 먼저 수록하기 위해 값이 같다면 고유번호가 낮은 곡이 앞에 배치 되도록 함

if $0.1 == $1.1{
    return $0.0 < $1.0
}

 

4. 각 장르에서 최대 2개의 노래를 앨범에 추가함

if arr.count <= 2{
    result += arr
}
else{
    result.append(arr[0])
    result.append(arr[1])
}

 

 

 

내 풀이)

import Foundation

func solution(_ genres:[String], _ plays:[Int]) -> [Int] {
    
    var dic: [String : Int] = [:] // 장르:총합횟수
    var dic2: [String:[Int]] = [:] // 장르:[인덱스]
    var dic3: [Int:Int] = [:] // 인덱스,듣는횟수
    
    for i in 0..<genres.count{
        let genre = genres[i]
        
        if dic[genre] == nil{
            dic[genre] = plays[i]
        }
        else{
            dic[genre] = dic[genre]! + plays[i]
        }
        if dic2[genre] == nil{
            dic2[genre] = [i]
        }
        else{
            dic2[genre]?.append(i)
        }
        dic3[i] = plays[i]
    }
    
    let sortOne = dic.sorted{$0.1 > $1.1} //1번 규칙 - 많이 실행된 장르
    
    var result = [Int]()
    
    for i in sortOne{
        let a = dic2[i.key]! 
        var d: [Int:Int] = [:] // 인덱스 : 듣는횟수
        for j in a{
            d[j] = dic3[j] //
        }
        var arr = d.sorted{
            if $0.1 == $1.1{  //3번 규칙 - 재생 횟수 같은 경우 고유 번호 낮은 노래 먼저 수록
                return $0.0 < $1.0
            }
            return $0.1 > $1.1 //2번 규칙 - 장르 내에서 많이 재생된 노래 수록
        }.map{$0.key}
        
        if arr.count <= 2{
            result += arr
        }
        else{
            result.append(arr[0])
            result.append(arr[1])
        }
    }
    return result
}