Programmers.순위 검색

junseole·2021년 8월 18일
0

미워도 다시 한번

목록 보기
2/3
post-thumbnail

문제 설명

코딩테스트 참여 개발언어 항목에 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라는 함수을 이용하여 문자를 자른다고 한다.

처음에는 순차적으로 다 탐색하려고 했지만 그럴시에 시간 초과가 난다고 한다.

이분 탐색을 이용하면 시간 초과가 나오지 않는다.

문제 바로가기

profile
Swift와 함께 여행중입니다.

0개의 댓글