본문 바로가기
알고리즘/프로그래머스

프로그래머스: 해시 - 베스트앨범

by 패쓰킴 2023. 11. 29.
728x90

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

 

프로그래머스

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

programmers.co.kr

 

풀이

장르별 많이 재생된 두곡 씩 추리는 문제

해시테이블의 인덱스를 어떻게 이용해야 하나 고민하다가

장르를 키로 갖고, 인덱스와 재싱수를 딕셔너리 벨류로 갖는 딕셔너리를 만들었는데

그 뒤로는 생각이 너무 많아 쉽사리 코드로 옮기지를 못했다...

시간을 너무 소비하였고 다른 사람의 풀이로 코드를 이해해보기로 했다.

결국 문제를 하나씩 분리해서 그대로 코드로 작성하면 되는 것이었음.

앞으로는 너무 생각을 많이 하지 않고 코드로 일단 옮기는 연습을 좀 더 해야할 것 같다.. ㅠ

func solution(_ genres:[String], _ plays:[Int]) -> [Int] {
    var playsByGenre: [String:Int] = [:]
    var idsByGenre: [String:[Int]] = [:]

    /* playsByGenre = 장르:재생합
       idsByGenre = 장르:인덱스
    */
    for i in 0..<genres.count {
        let genre = genres[i]
        let play = plays[i]

        if let pCount = playsByGenre[genre] {
            playsByGenre[genre] = pCount + play
        } else {
            playsByGenre[genre] = play
        }
        if idsByGenre[genre] != nil {
            idsByGenre[genre]!.append(i)
        } else {
            idsByGenre[genre] = [i]
        }
    }
    
    // 재생합이 많은 장르 순으로 만들고
    let bestGenre: [String] = Array(playsByGenre.keys).sorted{
        return playsByGenre[$0]! > playsByGenre[$1]!
    }

    var answer: [Int] = []
    
    for genre in bestGenre {
        // bestGenre 순으로
        // idsByGenre의 인덱스, 즉 plays의 인덱스를 이용하여 값이 더 큰 순으로 정렬 
        let IDs = idsByGenre[genre]!.sorted{
            return plays[$0] > plays[$1]
        }
        
        // answer에 2개씩 넣어줌
        answer.append(IDs[0])
        if IDs.count > 1 {
            answer.append(IDs[1])
        }
    }
    return answer
}

출처: https://tngusmiso.tistory.com/24

728x90

댓글