https://programmers.co.kr/learn/courses/30/lessons/84325
난이도가 낮은 구현 문제라고 할 수 있다.
주어진 조건대로 구현하면 문제 없다.
개발자가 사용하는 언어의 언어 선호도 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
}
'코딩테스트' 카테고리의 다른 글
백준 - 쇠막대기 - 10799 - swift (0) | 2021.08.24 |
---|---|
백준 - 구슬 탈출 1, 2, 4, 13459, 13460, 15653 - swift (0) | 2021.08.23 |
백준 - 주간 달력 - 22936 - swift (0) | 2021.08.22 |
백준 - 쿠키크루 - 22939 - swift (0) | 2021.08.22 |
LeetCode - 98. Validate Binary Search Tree - swift (0) | 2021.08.20 |