본문 바로가기
코딩테스트

프로그래머스 - 위클리 챌린지 4주차 - 직업군 추천하기 - swift

by vapor3965 2021. 8. 23.

목차

    https://programmers.co.kr/learn/courses/30/lessons/84325

     

    코딩테스트 연습 - 4주차

    개발자가 사용하는 언어와 언어 선호도를 입력하면 그에 맞는 직업군을 추천해주는 알고리즘을 개발하려고 합니다. 아래 표는 5개 직업군 별로 많이 사용하는 5개 언어에 직업군 언어 점수를 부

    programmers.co.kr

     

     

    난이도가 낮은 구현 문제라고 할 수 있다.

    주어진 조건대로 구현하면 문제 없다.

     

     개발자가 사용하는 언어의  언어 선호도 x  직업군 언어 점수 의 총합이 가장 높은 직업군을 return 하도록 solution 함수를 완성해주세요. 총합이 같은 직업군이 여러 개일 경우, 이름이 사전 순으로 가장 빠른 직업군을 return 해주세요.

     

    문제는 총 5개의 직업군이 존재하므로, 

    dictionary 타입으로, key는 직업군이름, value는 점수를 담도록 변수를 만든다. 

    그리고 언어 선호도와 개발자가 선택한 언어들을 탐색하면서, dictionary에 직업군이름과 점수를 갱신한다. 

    그러므로, 답을 Return할때는 정렬시켜 하나만 뽑도록 한다. 

     

    table는 [String] 타입인데, 이를 [[String]]으로 만들기 위해 split과  map을 이용했다. 

    그렇게 되면 "SI JAVA JAVASCRIPT SQL PYTHON C#" -> ["SI", "JAVA", "JAVASCRIPT", "SQL", "PYTHON", "C#"]으로 생성된다. 

    그럼 여기서, 특정 언어를 선택하는 방법은, index를 찾도록 한다.JAVA를 선택했다면, 위의 배열에서는 firstIndex(of: "JAVA") 를 이용하면 옵셔널로 index 1이 반환된다.여기서 6-1을 하면 5점이 되고,C#을 선택했다면, index 5가 반환되고, 6-5 는 1점이 된다.만약 배열에 없다면 nil을 반환하므로, 옵셔널 바인딩을 통해 쉽게 구별할 수 있다.

     

    또한, languages와 preference는 같은 배열의 크기이므로, zip을 이용하여 더 간결하게 코드를 작성할 수 있다.

     

    import Foundation
    
    func solution(_ table:[String], _ languages:[String], _ preference:[Int]) -> String {
        
        var ans = [String: Int]()
        
        let table = table.map { $0.split(separator: " ").map{String($0)}}
        
        zip(languages, preference).forEach { l, p in
            table.forEach { t in
                if let idx = t.firstIndex(of: l) {
                    ans[t.first!, default: 0] += p*(6-idx)
                } else {
                    ans[t.first!, default: 0] += 0
                }
            }
        }
        
        return ans.sorted(by: {$0.value == $1.value ? $0.key < $1.key : $0.value > $1.value}).first!.key
    }

     

     

     

    댓글