본문 바로가기
알고리즘 문제 풀이

프로그래머스 - 베스트 앨범(Kotlin)

by 가나무마 2022. 8. 9.
728x90

본 알고리즘 풀이는 Routine Study에서 진행하고 있습니다.

https://github.com/ROUTINE-STUDY/Algorithm

 

저를 포함한 구성원이 대부분 초보이므로, 원하시는분은 언제라도 들어오셔도 좋습니다.

 

GitHub - ROUTINE-STUDY/Algorithm: 초보 알고리즘 스터디 / 누구나 참여 가능

초보 알고리즘 스터디 / 누구나 참여 가능 :runner:. Contribute to ROUTINE-STUDY/Algorithm development by creating an account on GitHub.

github.com

문의는 댓글 바람.

 

문제 출처 : https://school.programmers.co.kr/learn/courses/30/lessons/42579

 

[문제 설명]

조건에 맞게 정렬하시오.

 

[접근 방법]

장르를 우선으로, 재생수, 인덱스 번호로 정렬한다.

class Solution {
    fun solution(genres: Array<String>, plays: IntArray): IntArray {
        // key는 장르, value는 재생횟수.
        val cntOfPlayed = mutableMapOf<String, Int>()
        // 장르별 선정된 노래 개수
        val cntOfPickedGenre = mutableMapOf<String, Int>()
        // 노래 리스트
        val listOfSong = ArrayList<Song>()
        // 장르별 플레이 횟수 추가
        for (i in genres.indices) {
            listOfSong.add(Song(genre = genres[i], cnt = plays[i], idx = i))
            cntOfPlayed[genres[i]] = plays[i] + cntOfPlayed.getOrDefault(genres[i], 0)
        }

        listOfSong.sortWith { o1, o2 ->
            if (cntOfPlayed[o1.genre]!! < cntOfPlayed[o2.genre]!!) {
                1
            } else if (cntOfPlayed[o1.genre]!! > cntOfPlayed[o2.genre]!!) {
                -1
            } else if (o1.cnt < o2.cnt) {
                1
            } else if (o1.cnt > o2.cnt) {
                -1
            } else if (o1.idx < o2.idx) {
                -1
            } else if (o1.idx > o2.idx) {
                1
            } else {
                1
            }
        }

        cntOfPlayed.forEach { (key, value) ->
            cntOfPickedGenre[key] = 0
        }

        val answerList = ArrayList<Int>()
        for (i in listOfSong.indices) {
            if (cntOfPickedGenre[listOfSong[i].genre]!! < 2) {
                answerList.add(listOfSong[i].idx)
                cntOfPickedGenre[listOfSong[i].genre] = 1 + cntOfPickedGenre[listOfSong[i].genre]!!
            }
        }

        return answerList.toIntArray()
    }
}

class Song(val genre: String, val cnt: Int, val idx: Int)

 

[compareBy를 사용해서 간단하게 작성]

class Solution {
    fun solution(genres: Array<String>, plays: IntArray): IntArray {
        // key는 장르, value는 재생횟수.
        val cntOfPlayed = mutableMapOf<String, Int>()
        // 장르별 선정된 노래 개수
        val cntOfPickedGenre = mutableMapOf<String, Int>()
        // 노래 리스트
        var listOfSong = mutableListOf<Song>()
        // 장르별 플레이 횟수 추가
        for (i in genres.indices) {

            listOfSong.add(Song(genre = genres[i], cnt = plays[i], idx = i))
            cntOfPlayed[genres[i]] = plays[i] + cntOfPlayed.getOrDefault(genres[i], 0)
        }

        listOfSong.sortWith(
            compareBy(
                { cntOfPlayed[it.genre]?.times(-1) },
                { it.cnt.times(-1) },
                { it.idx }
            )
        )

        cntOfPlayed.forEach { (key, value) ->
            cntOfPickedGenre[key] = 0
        }

        val answerList = ArrayList<Int>()
        for (i in listOfSong.indices) {
            if (cntOfPickedGenre[listOfSong[i].genre]!! < 2) {
                answerList.add(listOfSong[i].idx)
                cntOfPickedGenre[listOfSong[i].genre] = 1 + cntOfPickedGenre[listOfSong[i].genre]!!
            }
        }

        return answerList.toIntArray()
    }
}

class Song(val genre: String, val cnt: Int, val idx: Int)
728x90
반응형