기록
[Kotlin] 롤케이크 자르기 본문
반응형
시간초과 코드
fun main() {
val s = Solution()
//println(s.solution(intArrayOf(1, 2, 1, 3, 1, 4, 1, 2)))
println(s.solution(intArrayOf(1, 2, 3, 1, 4)))
}
class Solution {
fun solution(topping: IntArray): Int {
var answer: Int = 0
for(point in 0..topping.size-1) {
val leftTopping = topping.copyOfRange(0, point + 1)
val rightTopping = topping.copyOfRange(point + 1, topping.size)
val leftToppingCount = leftTopping.toSet().count()
val rightToppingCount = rightTopping.toSet().count()
if(leftToppingCount == rightToppingCount)
answer++
}
return answer
}
}
시간복잡도가 O(N^2)으로 시간초과가 발생했다.
1 ≤ topping의 길이 ≤ 1,000,000 인 걸 보니 선형시간 코드를 작성해야 통과가 될 것 같다.
통과 코드
fun main() {
val s = Solution()
println(s.solution(intArrayOf(1, 2, 1, 3, 1, 4, 1, 2)))
//println(s.solution(intArrayOf(1, 2, 3, 1, 4)))
}
class Solution {
fun solution(topping: IntArray): Int {
var answer: Int = 0
val me = HashMap<Int, Int>()
val bro = HashMap<Int, Int>()
topping.forEach {
me[it] = me.getOrDefault(it, 0) + 1
}
for(t in topping) {
bro[t] = bro.getOrDefault(t, 0) + 1
me[t] = me[t]!! - 1
if(me[t] == 0) me.remove(t)
if(me.size == bro.size) answer++
}
return answer
}
}
다른 블로그의 도움을 받았다.
처음에 모든 롤케이크를 me에게 할당하고, 하나씩 bro에게 나눠주면서 사이즈를 비교하는 방식의 해결 방법이다.
반응형
'[Study] > 코딩테스트 연습' 카테고리의 다른 글
[Kotlin] 다익스트라 알고리즘 (최단경로 구하기) / 백준 1753번 (0) | 2023.05.22 |
---|---|
BFS (0) | 2023.04.14 |
DFS (0) | 2023.04.14 |
십진수를 이진수로 변환 (0) | 2023.04.14 |
버블 정렬 (0) | 2023.04.13 |