[Algorithm] 프로그래머스 스킬트리

Updated:

문제 설명

33

나의 풀이

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 값을 반환한다. 이때 빈칸도 포함이 되며, 위의 예시를 보면 정확하게 알 수 있다.

참고

Programmers
Apple document starts(with:)

Leave a comment