01. 이해
전체 학생 중에 일부는 체육복을 도둑 맞았고, 일부는 체육복을 두 벌 들고있다.(세 벌은 놉)
(두 벌 들고 있으면서 도둑 맞은 학생도 있을 수 있음, 그러나 두 벌 다 도둑맞지는 않음)
체육복이 두 벌인 학생들은 자기의 앞,뒤 번호 학생이 체육복이 없다면 빌려줄 수 있다.
체육복을 입을 수 있는 학생의 최댓값을 구해야 한다.
02. 계획
체육복을 도둑 맞은 학생과 여벌의 체육복이 있는 학생 사이의 중복을 삭제한다.
(여벌이 있어도 도둑맞았으면 다른 학생에게 빌려줄 수 없으니까)
그 후 정말로 체육복이 없는 학생들 리스트에서 차례대로 앞, 뒤의 학생에게서 체육복을
빌릴 수 있는 지 알아본다.
빌릴 수 있으면 빌리고 빌려준 학생은 여벌의 체육복이 있는 학생 리스트에서 삭제.
만약 빌릴 수 없으면 전체 학생수에서 -1 한다.
03. 실행
fun solution(n: Int, lost: IntArray, reserve: IntArray): Int {
var answer = n
val lostSet = lost.toSet() - reserve.toSet()
val reserveSet = (reserve.toSet() - lost.toSet()) as MutableSet
lostSet.forEach {
when {
it + 1 in reserveSet -> reserveSet.remove(it + 1)
it - 1 in reserveSet -> reserveSet.remove(it - 1)
else -> answer--
}
}
return answer
}
04. 회고
다른 사람이 짠 코드를 토대로 다시 해본 코드.
set, as, mutable은 알고는 있지만 손에서 나오지 않는 지식이었는데 이번 기회에 확실히
써보게 되었다.