문제
내가 처음 생각한 풀이
- lost와 reserve는 중복이 없다했으므로 set으로 만들고,
- 못 빌려주거나 체육복을 빌려준 경우 reserve set에서 제거하고 answer를 1 높여주었다.
import Foundation
func solution(_ n:Int, _ lost:[Int], _ reserve:[Int]) -> Int {
var answer = n - lost.count
// 중복이 없으므로, set으로 변환
var lostSet = Set(lost)
var reserveSet = Set(reserve)
// 여별이 있는 학생이 도난 당했을 경우 -> 체육복 하나니까 두 set에서 제거
for student in reserveSet {
if lostSet.contains(student) {
answer += 1
lostSet.remove(student)
reserveSet.remove(student)
}
}
// 체육복 빌릴 수 있는 친구 탐색하고
// 다시 빌리는걸 방지하기 위해 빌리면 set에서 제거
for student in lostSet {
if reserveSet.contains(student - 1) {
answer += 1
reserveSet.remove(student - 1)
lostSet.remove(student)
continue
}
if reserveSet.contains(student + 1) {
answer += 1
reserveSet.remove(student + 1)
lostSet.remove(student)
}
}
return answer
}
하지만 결과는 테스트 11에서 자꾸 걸리는 것이었고, 아무리 머리 쥐어뜯어도 어떤 예외사항에 의해 걸리는지 모르겠다..🤯
두 번째 방법
위대하신 구박사님의 도움을 받아 한 블로그의 풀이를 참고하여 다시 풀었다.
방법
-
student
배열에 숫자로 status 초기화-
기본 옷이 있는 사람은 1
-
도난 당한 사람은 -1
-
여벌 소지한 사람은 +1
-
-
그 후 0인 사람 전 후로 2가 있으면 0에는 +1, 2에는 -1
- 해당 프로세스 시 인덱스 범위 밖 접근 조심하기!
코드
import Foundation
func solution(_ n:Int, _ lost:[Int], _ reserve:[Int]) -> Int {
// 없는 사람 0 / 옷 한벌 1 / 여분 소지 2
var student = [Int](repeating: 1, count: n)
for i in lost {
let index = i - 1
student[index] -= 1
}
for i in reserve {
let index = i - 1
student[index] += 1
}
// 체육복 빌려주기
for (index, value) in student.enumerated() {
if value == 0 {
if index > 0 && student[index - 1] == 2 {
student[index - 1] -= 1
student[index] += 1
} else if index < student.count - 1 && student[index + 1] == 2 {
student[index + 1] -= 1
student[index] += 1
}
}
}
let answer = student.filter { $0 >= 1 }.count
return answer
}
결과
나 운다… ( ꈨຶ ˙̫̮ ꈨຶ )