Problem From.
https://leetcode.com/problems/fruit-into-baskets/
오늘 문제는 fruits 배열을 처음부터 끝까지 볼때, 두가지의 과일만 담을 수 있는 바구니가 있다고 할때, 담을 수 있는 최대의 과일 수를 구하는 문제였다.
이 문제는 sliding window 를 이용하여 풀었는데, window 의 크기를 조절해가며, 그 window 안에 두가지의 과일 종류만 있도록 하면 되었다.
1, 1, 2, 3, 3, 2, 1
위와같은 배열이 있다고 했을때
처음에 1을 보면 하나의 종류이므로 담고
그 다음 1을 보면 같은 종류이므로 담고
그 다음 2를 보면 다른 종류 하나이므로 담고
그 다음 3을 봤을때는 다른 종류가 나왔으므로 window 크기를 하나 줄이고 (start 를 1 더해주고)
그 다음 3을 봤을때는 아직 3종류의 과일이 있으므로 window 크기를 또 하나 줄여준다
이런식으로 나가면 바구니에 담을 수 있는 최대의 과일 수인 4가 나온다.
class Solution {
fun totalFruit(fruits: IntArray): Int {
val map = hashMapOf<Int, Int>()
var start = 0
var end = 0
for(i in 0 until fruits.size) {
map.put(fruits[i], map.getOrDefault(fruits[i], 0) + 1)
if(map.size > 2) {
map.put(fruits[start], map.get(fruits[start])!! - 1)
if(map.get(fruits[start])!! == 0) {
map.remove(fruits[start])
}
start += 1
}
end += 1
}
return end - start
}
}