문제 설명 |
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다. 전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요. |
제한 조건 |
|
입출력 예 | |||
n | lost | reserve | return |
5 | [2,4] | [1, 3, 5] | 5 |
5 | [2,4] | [3] | 4 |
3 | [3] | [1] | 2 |
|
나의 풀이
1. 수업을 들을 수 있는 학생을 studentSet에 추가한다
① 1부터 n까지의 수를 studentSet에 추가
② 도난당한 학생 번호를 studentSet에서 삭제
③ 여벌을 가져온 학생 번호를 studentSet에 추가 (Set은 중복값 입력 불가, 도난/여벌 동시 학생 가리기 위함)
2. lo(도난 학생번호)와 res(여벌 학생번호)의 차이가 1이고,
res가 rentSet에 들어가있지 않고,
lo가 studentSet에 들어가있지 않으면 rentSet에 res를 추가하고 studentSet에 lo를 추가
3. studentSet의 길이를 리턴
class Solution {
fun solution(n: Int, lost: IntArray, reserve: IntArray): Int {
val studentSet: MutableSet<Int> = mutableSetOf()
val rentSet: MutableSet<Int> = mutableSetOf()
for (i in 1..n) { studentSet.add(i) }
lost.sorted().filter { studentSet.remove(it)
rentSet.add(it) }
reserve.sorted().filter { studentSet.add(it) }
for (res in reserve.sorted()) {
for (lo in lost.sorted()) {
if (kotlin.math.abs(res-lo) == 1 && !rentSet.contains(res) && !studentSet.contains(lo)) {
rentSet.add(res)
studentSet.add(lo)
}
}
}
return studentSet.size
}
}
이미 풀어봤던 문제라 이렇게 오래 걸릴 줄 몰랐다. 문제 푸는데 거의 3시간 걸린 것 같은데, 문제에 함정이 많았다. 우여곡절 끝에 풀기는 했지만 내 맘에 드는 풀이는 아니다. 참고!! ① 13,14번을 틀리는 사람 => lost와 reserve를 정렬해야함 ② 5,7,11번 등을 틀리는 사람 => 도난/여벌에 동시에 들어가 있는 학생 고려해야함 |
Kotlin 코드 정리
class Solution {
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
}
}
같은 MutableSet인데 차이 무엇...? ㅠㅠ |
'프로그래머스 > Kotlin | Level1' 카테고리의 다른 글
[프로그래머스/Kotlin]Level1 - 소수 만들기 (0) | 2023.02.23 |
---|---|
[프로그래머스/Kotlin]Level1 - 모의고사 (0) | 2023.02.23 |
[프로그래머스/Kotlin]Level1 - 2016년 (0) | 2022.01.12 |
[프로그래머스/Kotlin]Level1 - 두 개 뽑아서 더하기 (0) | 2022.01.12 |
[프로그래머스/Kotlin]Level1 - 문자열 내 마음대로 정렬하기 (0) | 2022.01.05 |