문제설명
- Skill이 주어지는데 그 스킬 알파벳순서대로 익힐 수 있다.
- 해당 알파벳빼고 그 순서 안지킨애들 아웃시켜주면 될 듯
문제 접근
- 근데
CBD
라는게 주어졌을 때 이거 다 안나올 수도 있는데 그거에 대한 처리만 잘해주면 될 것 같음
문제풀이
- 처음에는 일단 스킬트리에서 주어진 스킬빼고 필요없는 것들은 다
filter
로 지워줬다.- 그리고 거기서 이제
firstIndex
써서 인덱스값 찾아주고자 했다.
import Foundation
func solution(_ skill: String, _ skill_trees: [String]) -> Int {
let skill = Array(skill)
for user in skill_trees {
let core_skill = Array(user.filter {
skill.contains($0)
})
for sk in core_skill {
print(skill.firstIndex(of: sk))
}
}
return -1
}
중간 상태인데, 여기서 이제 Optional로 나오는 firstIndex를 언래핑해주고, index비교하면서 스킬 선후관계 비교하면 될 듯 ?
skill.firstIndex(of: 배우고자하는 스킬)
을 찾으면 그 인덱스를 스킬습득근황에 비교하는 구조다.import Foundation
func solution(_ skill: String, _ skill_trees: [String]) -> Int {
let skill = Array(skill)
var answer = 0
for user in skill_trees {
let core_skill = Array(user.filter {
skill.contains($0)
})
var 스킬습득근황 = Array(repeating: false, count: skill.count)
var 현재테케 = true
for sk in core_skill {
let 현재스킬 = skill.firstIndex(of: sk)!
if 현재스킬 == 0 { // 처음 스킬이라면 선행스킬이 없어도 됨
스킬습득근황[0] = true
continue
}
else {
if 스킬습득근황[현재스킬 - 1] {
스킬습득근황[현재스킬] = true
}
else {
현재테케 = false
break
}
}
}
if 현재테케 { answer += 1 }
}
return answer
}
채점 결과
정확성: 100.0
합계: 100.0 / 100.0
타인의 코드
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
}
필요없는 스킬들 가지쳐준거는 똑같은데,
starts(with)
이게 뭐지? 해서 좀 찾아봤다.
Returns a Boolean value indicating whether the initial elements of the sequence are the same as the elements in another sequence.
시퀀스의 초기 요소가 다른 시퀀스의 요소와 동일한지 여부를 나타내는 BOOL 값을 반환합니다.
그니까 이게 순서대로 잘 적합하게 들어맞는지를 판단해주는 친구다 스킬 트리 자체가 띄엄띄엄 못배우고 어처피 순서대로 배울 수 밖에 없기 때문에, start(with:)으로 엄청 간단하게 할 수 있는거였다..!
var a = "CBD"
var b = "CB"
print(a.starts(with: b)) // true
print(a.starts(with: "C")) // true