코딩 테스트 연습 - 체육복(프로그래머스 레벨1) 개선하기

다용도리모콘·2020년 3월 17일
0

CodingTest

목록 보기
6/34

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은 알고는 있지만 손에서 나오지 않는 지식이었는데 이번 기회에 확실히
써보게 되었다.

0개의 댓글