[Algorithm] 프로그래머스 스킬트리
Updated:
문제 설명
나의 풀이
import Foundation
func solution(_ skill:String, _ skill_trees:[String]) -> Int {
var check = [Int: Character]()
var check_len = 0
var possible = ""
var answer = 0
for skill_tree in skill_trees {
for (index,skills) in skill_tree.enumerated() {
if skill.contains(skills) {
check[index] = skills
}
}
check_len = check.count
possible = check.sorted(by: { $0.key < $1.key }).reduce("") { $0 + String($1.value) }
let index = skill.index(skill.startIndex, offsetBy: check_len)
if skill[skill.startIndex..<index] == possible {
answer += 1
}
check = [:]
check_len = 0
possible = ""
}
return answer
}
괜찮은 남의 풀이
import Foundation
func solution(_ skill:String, _ skill_trees:[String]) -> Int {
func available(_ s: String, _ t: String) -> Bool {
let alza = t.filter { s.contains($0) }
return s.starts(with: alza)
}
return skill_trees.map { available(skill, $0) }.filter { $0 }.count
}
skill_trees에 있는 각각의 원소를 skill과 함께 available 함수에 넣는데, 이때 t가 skill의 원소이면 이를 걸러내서 alza
에 저장한다. 이후 start(with:)
를 사용해서 skill안에 alza의 순서로 있는 string을 만들 수 있는지 bool 값으로 돌려준다. 그리고 이를 filter로 걸려서 true인 값들만 개수를 파악해서 반환한다.
이 풀이에서 핵심은 starts(with:_)
이다.
func starts<PossiblePrefix>(with possiblePrefix: PossiblePrefix) -> Bool
where PossiblePrefix : Sequence, Character == PossiblePrefix.Element
var skill = "CBD"
var skills = ["CBD", "CB", "C", "", "BD", "D", "BDC"]
for i in skills {
print(skill.starts(with: i))
}
// true, true, true, true, false, false, false
A.starts(with: B)는 결국 A가 B로 시작하는가에 대해서 Bool 값을 반환한다. 이때 빈칸도 포함이 되며, 위의 예시를 보면 정확하게 알 수 있다.
Leave a comment