728x90
본 알고리즘 풀이는 Routine Study에서 진행하고 있습니다.
https://github.com/ROUTINE-STUDY/Algorithm
저를 포함한 구성원이 대부분 초보이므로, 원하시는분은 언제라도 들어오셔도 좋습니다.
문의는 댓글 바람.
문제 출처 : 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
반응형
'알고리즘 문제 풀이' 카테고리의 다른 글
2022 Winter Coding - 겨울방학 스타트업 인턴 프로그램 후기 (2) | 2022.11.05 |
---|---|
백준 - 시리얼 번호(Kotlin) (0) | 2022.10.03 |
프로그래머스 - 예상 대진표(Kotlin) (0) | 2022.08.09 |
백준 - 패션왕 신해빈(Kotlin) (0) | 2022.07.26 |
백준 - 친구 (0) | 2022.06.15 |