Problem From.
https://leetcode.com/problems/minimum-rounds-to-complete-all-tasks/
오늘 문제는 주어진 배열에서 일을 2개 또는 3개씩 묶어서 처리할때 나오는 최소 묶음의 수를 반환하거나 반환할 수 없을 때는 -1 을 return 하는 문제였다.
이 문제를 푸는 가장 중요한 아이디어는 2이상의 수는 무조건 2와 3으로 만들 수 있다는 것이다.
그러므로 묶었을 때 갯수가 1 인게 있으면 -1을 리턴하고,
다른 숫자에 대해서는 3으로 나눈 나머지가 0이면 몫을 반환, 그 외에는 몫 + 1 을 반환하면 되었다.
class Solution {
fun minimumRounds(tasks: IntArray): Int {
var answer = 0
var isDivide = true
val map = mutableMapOf<Int, Int>()
tasks.forEach{ num ->
map.put(num, map.getOrDefault(num, 0) + 1 )
}
map.forEach { key, value ->
if(value == 1) {
isDivide = false
return@forEach
}
when(value % 3) {
0 -> {
answer += value / 3
}
else -> {
answer += value / 3 + 1
}
}
}
return if(isDivide) answer else -1
}
}
위 풀이의 시간 복잡도는 O(kn) 이 된다.
이야.. 시간복잡도까지.. 내머리가 복잡하네