- lost와 reserve 배열에 중복이 발생할 수 있다.
- 이를 없애기 위해 N 크기의 배열을 선언하고 super set을 만들었다.
- super set에서 최종 lost와 reserve를 확인하고 이를 두 개의 idx를 이동시키며 판단하였다.
- 다른 사람이 푼 내용을 보니 set을 뺄셈으로 super set으로 만드는 것을 확인하였다.
- 역시 kotlin, 그리고 함수형 프로그래밍에는 아직 모르는 표현이 많다..
fun solution(n: Int, lost: IntArray, reserve: IntArray): Int {
val HAVE_ONE = 1
val HAVE_TWO = 2
var answer = 0
var mStudentsTable = Array<Int>(n + 1){HAVE_ONE}
var mReserveList = mutableListOf<Int>()
var mLostList = mutableListOf<Int>()
for (i in reserve.indices) mStudentsTable[reserve[i]]++
for (i in lost.indices) mStudentsTable[lost[i]]--
for (i in 1..n) {
if (mStudentsTable[i] == HAVE_ONE) {
answer++
} else if (mStudentsTable[i] == HAVE_TWO) {
mReserveList.add(i)
answer++
} else {
// ZERO
mLostList.add(i)
}
}
var j = 0
var i = 0
while (i < mLostList.size) {
if (mReserveList.size <= j) break
if (mLostList[i] + 1 == mReserveList[j] || mLostList[i] - 1 == mReserveList[j]) {
// matching
answer++
j++
i++
continue
}
if (mLostList[i] - 1 > mReserveList[j]) {
// 아예 작은 case mLostList가 오름차순이기 때문에 볼 필요 없다.
j++
continue
}
if (mLostList[i] + 1 < mReserveList[j]) {
// Reserve가 더 큰 경우, j는 그대로
i++
continue
}
}
return answer
}
- 아래는 다른 사람의 풀이방법이다.
- set을 뺄셈으로 super set을 만들고, when 절을 이용해 값을 찾았다.
- reserve set은 수정해야하니 as MutableSet으로 선언하였다.
- when 절에도 집중하자.
fun solution(n: Int, lost: IntArray, reserve: IntArray): Int {
var answer = n
var lostSet = lost.toSet() - reserve.toSet()
var reserveSet = (reserve.toSet() - lost.toSet()) as MutableSet
for (i in lostSet) {
when {
i + 1 in reserveSet -> reserveSet.remove(i + 1)
i - 1 in reserveSet -> reserveSet.remove(i - 1)
else -> answer--
}
}
return answer
}