프로그래머스 해쉬문제 level3 풀어봄
class Solution {
fun solution(genres: Array<String>, plays: IntArray): IntArray {
val hashMap = HashMap<String,MutableList<MutableList<Int>>>()
var mPosition = 0
for (i in genres){
val mutableDataInt = mutableListOf<Int>()
mutableDataInt.add(plays[mPosition])
mutableDataInt.add(mPosition)
hashMap[i]?.add(mutableDataInt) ?: hashMap.put(i, mutableListOf(mutableDataInt))
mPosition += 1
}
println(hashMap)
val mutableListOfGenre = mutableMapOf<String,Int>()
for (i in hashMap.keys){
mutableListOfGenre[i]=
hashMap[i]?.fold(0){acc, mutableList ->
acc+mutableList[0]
}!!
}
println(mutableListOfGenre)
println(mutableListOfGenre.toList().sortedBy { (_,values)->values }.toMap())
val resultMap = mutableListOf<Int>()
for ( i in mutableListOfGenre.toList().sortedByDescending { (_,values)->values }.toMap().keys){
val a=hashMap[i]?.toList()?.sortedByDescending { (key, _)->
key
}
println(a)
if (a != null) {
if(a.size >=2){
resultMap.add(a[0][1])
resultMap.add(a[1][1])
}else if (a.size == 1){
resultMap.add(a[0][1])
}
}
println(resultMap)
}
var answer = resultMap.toIntArray()
return answer
}
}
일단 내 풀이인데.. 다른 사람들거 보면서 배울게 너무 많았음
내꺼를 풀면서 얻은것
1. ?: 사용
hashMap[i]?.add(mutableDataInt) ?: hashMap.put(i, mutableListOf(mutableDataInt))
이렇게 사용하여서 해쉬에 넣어줫음. ?: 로 null처리를 함 null이면 해쉬에 키를 받는 거 넣어줌 이게 맞는지 모르겠는데 어플 만들때도 이런식으로 해결한 경험이 있어서 이렇게 사용했음.
2.fold 사용
fold 는 처음 문제 풀면서 배운건데 한번 적용해봤음.
3. indices
Returns an IntRange of the valid indices for this collection.
val empty = emptyList<Any>()
println("empty.indices.isEmpty() is ${empty.indices.isEmpty()}") // true
val collection = listOf('a', 'b', 'c')
println(collection.indices) // 0..2
범위를 표현해준다. collection의 position 범위
genres.indices.groupBy { genres[it] }
이런식으로도 사용하더라.. 이건 범위를 사용해서 그룹으로 묶어주는 과정임
답변 진짜 예술이더라..
4.take
말 그대로 take(2) 하면 2개만 가져옴 앞에서부터
5. flatten()
Returns a single list of all elements from all collections in the given collection.
public fun <T> Iterable<Iterable<T>>.flatten(): List<T> {
val result = ArrayList<T>()
for (element in this) {
result.addAll(element)
}
return result
}
말 그대로 flat하게 하나의 리스트로 만들어줌
6. forEachIndexed()
Performs the given action on each element, providing sequential index with the element.
var playsMap = mutableMapOf<String, Int>()
genres.forEachIndexed { index, element ->
playsMap.put(
element,
playsMap.getOrDefault(element, 0) + plays[index]
)
}
이런식으로도 간단하게 생성이 가능하네..
여기서 getOrDeafault()
Returns the value corresponding to the given key, or defaultValue if such a key is not present in the map
public fun getOrDefault(key: K, defaultValue: @UnsafeVariance V): V {
// See default implementation in JDK sources
return null as V
}
처음에 값이 없으면 디폴트 값을 가져라는 함수임..
7.comparable
여기 설명 잘되있는듯
8.PriorityQueue
Creates a PriorityQueue with the default initial capacity (11) that orders its elements according to their natural ordering.
Compares this object with the specified object for order. Returns zero if this object is equal to the specified other object, a negative number if it's less than other, or a positive number if it's greater than other.
이건 나중에 다시 해야겠음..
※ toMap 이런거 사용하면 효율성이 떨어지니까 다르게 만들어보기
'코딩테스트(코틀린) 기초부터 연습' 카테고리의 다른 글
프로그래머스 h-index문제 (정렬) (0) | 2021.04.06 |
---|---|
프로그래머스 가장큰수 (0) | 2021.04.05 |
코틀린에서 .map 사용.. 유용함 (0) | 2021.04.05 |
프로그래머스 다리를지나는 트럭 (0) | 2021.04.04 |
mutableList와 groupBy, Let, fold (0) | 2021.04.03 |