코딩테스트 참여 개발언어 항목에 cpp, java, python 중 하나를 선택해야 합니다.
지원 직군 항목에 backend와 frontend 중 하나를 선택해야 합니다.
지원 경력구분 항목에 junior와 senior 중 하나를 선택해야 합니다.
선호하는 소울푸드로 chicken과 pizza 중 하나를 선택해야 합니다.
query에 나오는 조건과 비교하여 포함되는 사람의 수를 출력한다.
import Foundation
func solution(_ info:[String], _ query:[String]) -> [Int] {
var ret:[Int] = []
var db:Dictionary<String, [Int]> = [ : ]
for i in info{
let arr = i.components(separatedBy: " ")
let languages = [arr[0],"-"]
let jobs = [arr[1],"-"]
let careers = [arr[2],"-"]
let soulFoods = [arr[3],"-"]
let score = Int(arr[4])!
for language in languages{
for job in jobs{
for career in careers{
for soulFood in soulFoods{
let key = "\(language)\(job)\(career)\(soulFood)"
if db[key] == nil{
db[key] = [score]
}else{
db[key]?.append(score)
}
}
}
}
}
}
for i in db{
let sortValue = i.value.sorted()
db[i.key] = sortValue
}
query.forEach{
let arr = $0.components(separatedBy: " ")
let key = "\(arr[0])\(arr[2])\(arr[4])\(arr[6])"
let score = Int(arr[7])!
if let matchScore = db[key]{
var start:Int = 0
var end = matchScore.count
while start < end {
let mid = (start + end) / 2
if matchScore[mid] >= score{
end = mid
}else{
start = mid + 1
}
}
ret.append(matchScore.count - start)
}else{
ret.append(0)
}
}
return ret
}
split을 이용해 처음 문자열을 나누었는데 split으로 이용할시에 subString을 반환한다는 점이였다.
그래서 인터넷에 찾아본결과 components라는 함수을 이용하여 문자를 자른다고 한다.
처음에는 순차적으로 다 탐색하려고 했지만 그럴시에 시간 초과가 난다고 한다.
이분 탐색을 이용하면 시간 초과가 나오지 않는다.