[Algorithm] 프로그래머스 체육복
Updated:
문제 설명
나의 풀이
import Foundation
func solution(_ n:Int, _ lost:[Int], _ reserve:[Int]) -> Int {
var reallyReserve: [Int] = []
var reallyLost: [Int] = []
for student in lost {
if !reserve.contains(student) {
reallyLost.append(student)
}
}
for student in reserve {
if !lost.contains(student) {
reallyReserve.append(student)
}
}
var checkDic = [Int: Bool]()
for i in 0...n+1 {
if reallyReserve.contains(i) {
checkDic[i] = true
}
else {
checkDic[i] = false
}
}
var count = 0
for student in reallyLost {
if checkDic[student+1]! {
count += 1
checkDic[student+1] = false
}
else if checkDic[student-1]! {
count += 1
checkDic[student-1] = false
}
}
return n - reallyLost.count + count
}
고민한 점
실제로 배열에서 지워줄까 아니면 dictonary를 만들어서 체크해줄까 라는 고민을 했으며 후자로 구현해보았다. 이때 학생의 번호가 1번이거나 n번일때에도 오류가 나지 않게 하기 위해서 Dictionary의 초기값을 설정할 때 범위를 0부터 n+1까지 false로 해주었다.
괜찮은 남의 풀이
import Foundation
func solution(_ n:Int, _ lost:[Int], _ reserve:[Int]) -> Int {
var losted = lost.filter{!reserve.contains($0)}
var reserved = reserve.filter{!lost.contains($0)}
var ans = n - losted.count
for i in 0..<losted.count {
var has: Int?
for j in 0..<reserved.count {
if losted[i] == reserved[j] - 1 || losted[i] == reserved[j] + 1 {
has = j
break
}
}
if let index = has {
reserved.remove(at: index)
ans += 1
}
}
return ans
}
filter를 사용해서 내가 for문으로 한 것을 빠르게 할 수 있다는 것을 항상 생각해보자..
Leave a comment