https://school.programmers.co.kr/learn/courses/30/lessons/42862
문제
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해 주세요.
제한사항
전체 학생의 수는 2명 이상 30명 이하입니다.
체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
풀이1
class Solution {
fun solution(n: Int, lost: IntArray, reserve: IntArray): Int {
val lostSet: MutableSet<Int> = (lost.toSet() - reserve.toSet()) as MutableSet
val reserveSet: Set<Int> = reserve.toSet() - lost.toSet()
reserveSet.sorted().forEach {
if ((it - 1) in lostSet) {
lostSet.remove(it - 1)
} else if ((it + 1) in lostSet) {
lostSet.remove(it + 1)
}
}
return n - lostSet.size
}
}
- 해당문제에서는 채육복을 잃어버린 사람들에 개 채육복을 나눠줄 경우 채육 수업을 들을 수 있는 최대학생의 수를 구하는 문제입니다. 해당문제는 set을 이용하여 풀 수도 있습니다. 그렇지만 이 방법은 set을 만들고 유지하는데 비용이 많이 들고 정렬을 해야 한다는 점에서 그렇게 선호하는 방법은 아닙니다.
결과 1
풀이 2
class Solution {
fun solution(n: Int, lost: IntArray, reserve: IntArray): Int {
val studentsLost = BooleanArray(n + 1) { true }
val studentsReserve = BooleanArray(n + 1)
lost.forEach { studentsLost[it] = false }
reserve.forEach {
if (!studentsLost[it]) {
studentsLost[it] = true
} else {
studentsReserve[it] = true
}
}
var max = 0
for (i in 1..n) {
if (studentsReserve[i]) {
if (i > 1 && !studentsLost[i - 1]) {
studentsLost[i - 1] = true
} else if (i < n && !studentsLost[i + 1]) {
studentsLost[i + 1] = true
}
}
}
for (i in 1..n) {
if (studentsLost[i]) max++
}
return max
}
}
- 저는 위 같은 배열을 사용하는것 선호합니다. 배열을 사용하면 set보다 만들고 유지하는 비용이 확실히 줄어듭니다. 게다가 위같이 채크를 위한경우 BooleanArray같은경우 다른 배열들보다 유지비용이 확실히 줄어듭니다. 또한 index값으로 넣어주기때문에 따로 정렬할 필요도 없습니다. 단점이라면 코드의 길이가 길어져 코드를 이해하기 쉽지 않을수도있다는 점입니다. 그렇지만 결과1과 결과 2를 비교해보면 알다시피 유지비용의 차이로 위같은 배열의 사용을 선호합니다.
결과2
'코틀린 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] - JadenCase 문자열 만들기(Kotlin) (0) | 2023.08.11 |
---|---|
[프로그래머스] - 로또의 최고 순위와 최저 순위(Kotlin && Java) (0) | 2023.08.11 |
[프로그래머스] - 로또의 최고 순위와 최저 순위(Kotlin) (0) | 2023.08.10 |
[프로그래머스] - 개인정보 수집 유효기간(Kotlin) (0) | 2023.08.10 |
[프로그래머스] - 피보나치 수(Kotlin) (0) | 2023.08.10 |