ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 - 베스트 앨범
    알고리즘 문제 풀이 2020. 7. 13. 22:45
    프로그래머스 - 베스트 앨범

    최근 프로그래머스에 있는 베스트 앨범 문제를 풀어보았는 데

    다른 사람의 코드를 보고 아주 놀라서 정리해 보았다.

    아래의 코드로 결과가 나오는데 딱 보기에는 이해가 되지 않아서

    한줄씩 출력해본 결과를 정리했다.

    genres.indices.groupBy { genres[it] }
    	.toList()
    	.sortedByDescending { it.second.sumBy { plays[it] } }
      .map { it.second.sortedByDescending { plays[it] }.take(2) }
    	.flatten()
    	.toIntArray()
    genres.indices
    >>> indices: 0..4
    indices
    Returns the range of valid indices for the array. Returns an IntRange of the valid indices for this collection. import kotlin.test.* fun main(args: Array ) { //sampleStart val empty = emptyList () println("empty.indices.isEmpty() is ${empty.indices.isEmpty()}") // true val collection = listOf('a', 'b', 'c') println(collection.indices) // 0..2 //sampleEnd }
    https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/indices.html

    indices 함수는 Array 의 유효한 인덱스를 IntRange 로 반환한다.

    genres.indices.groupBy { genres[it] }
    
    >>> groupBy: {classic=[0, 2, 3], pop=[1, 4]}
    groupBy
    Groups elements of the original array by the key returned by the given keySelector function applied to each element and returns a map where each group key is associated with a list of corresponding elements. The returned map preserves the entry iteration order of the keys produced from the original array.
    https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/group-by.html

    인덱스를 이용해 genres 의 값을 key 로 Map 을 생성한다.

    genres.indices.groupBy { genres[it] }
    	.toList()
    
    >>> toList: [(classic, [0, 2, 3]), (pop, [1, 4])]
    toList
    https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/to-list.html

    toListMapList<Pair>로 변환한다.

    genres.indices.groupBy { genres[it] }
    	.toList()
    	.sortedByDescending { it.second.sumBy { plays[it] } }
    
    >>> sortedByDescending: [(pop, [1, 4]), (classic, [0, 2, 3])]
    sortedByDescending
    https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/sorted-by-descending.html

    sortedByDescending 함수로 내림차순 정렬을 하는데 Pair의 두번째 값, 인덱스의 리스트를 이용하여 plays 의 합을 기준으로 정렬한다.

    genres.indices.groupBy { genres[it] }
    	.toList()
    	.sortedByDescending { it.second.sumBy { plays[it] } }
    	.map { it.second.sortedByDescending { plays[it] } }
    
    >>> map: [[4, 1], [3, 0, 2]]
    map
    Returns a list containing the results of applying the given transform function to each element in the original collection. import kotlin.test.* fun main(args: Array ) { //sampleStart val numbers = listOf(1, 2, 3) println(numbers.map { it * it }) // [1, 4, 9] //sampleEnd } Returns a list containing the results of applying the given transform function to each entry in the original map.
    https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/map.html

    정렬한 값을 map을 이용하여 리스트로 반환하는데 Pair 의 두번째 값인 인덱스 리스트를 돌면서 해당 plays 가 높은 값부터 내림차순 정렬한 리스트를 반환한다.

    genres.indices.groupBy { genres[it] }
    	.toList()
    	.sortedByDescending { it.second.sumBy { plays[it] } }
    	.map { it.second.sortedByDescending { plays[it] }.take(2) }
    
    >>> take: [[4, 1], [3, 0]]
    take
    https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/take.html

    반환된 리스트를take 함수를 이용해 2개의 요소만 가지게 한다.

    genres.indices.groupBy { genres[it] }
    	.toList()
    	.sortedByDescending { it.second.sumBy { plays[it] } }
    	.map { it.second.sortedByDescending { plays[it] }.take(2) }
    	.flatten()
    
    >>> flatten: [4, 1, 3, 0]
    flatten
    https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/flatten.html

    리스트 안에 리스트가 있는 상태인데 flatten 함수를 이용하여 하나의 리스트로 변환한다.

    genres.indices.groupBy { genres[it] }
    	.toList()
    	.sortedByDescending { it.second.sumBy { plays[it] } }
    	.map { it.second.sortedByDescending { plays[it] }.take(2) }
    	.flatten()
    	.toIntArray()
            
    >>> toIntArray: [I@548c4f57
    toIntArray
    Returns an array of Int containing all of the elements of this generic array. Returns an array of Int containing all of the elements of this collection. Returns an array of type IntArray, which is a copy of this array where each element is a signed reinterpretation of the corresponding element of this array.
    https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/to-int-array.html

    최종적으로 리스트를 IntArray 로 변환하게 되면 원하는 값이 나오게 된다.

    문제는 프로그래머스 사이트에 있으며

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

    20/07/13 현재 Yoonsung Nam , nhj-_- , 윤수현 이렇게 3분이 해당 코드를 작성하셨다

    • 나의 풀이
      class Solution{
          fun solution(genres: Array<String>, plays: IntArray): IntArray {
              val songMap = HashMap<String, MutableList<Song>>()
              val songPlayMap = HashMap<String, Int>()
      
              genres.forEachIndexed { index, genre ->
                  val song = Song(index, plays[index])
      
                  if (songMap[genre] !== null) {
                      songMap[genre]?.add(song)
                  } else {
                      songMap[genre] = mutableListOf(song)
                  }
      
                  songPlayMap[genre] = (songPlayMap[genre] ?: 0) + plays[index]
              }
      
              songMap.forEach {
                  it.value.sortByDescending { v -> v.play }
              }
      
              var answer = mutableListOf<Int>()
              songPlayMap.toList().sortedWith(compareByDescending { it.second }).forEach {
                  val songList = songMap[it.first]
                  val indexFilteredSongList = songList?.filterIndexed { index, song ->
                      index < 2
                  }
      
                  if (indexFilteredSongList != null) {
                      answer.addAll(indexFilteredSongList.map { song -> song.id })
                  }
      
              }
      
              return answer.toIntArray()
          }
      }
      
      data class Song(
          var id: Int,
          var play: Int
      )

    반응형

    댓글

Designed by Tistory.