체육복

HJ Kwon·2021년 12월 22일
0
  • 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
        }

0개의 댓글