Closed
Description
💬 문제
💬 Idea
<스택의 원리를 사용하자>
- 선수강되어야하는 skill 문자열을 배열형태로 바꾸어 stack을 만들어준다.
- skill: [”C”, “B”, “D”]
- 가장먼저 선수강되어야하는 skill을 pop하여 target에 저장한다.
- target: “C”
- skill: [”B”, “D”]
- 이후 skill_trees에 있는 각 스킬들을 돌면서
- currentSkill ≠ targetSkill (현재 수강하고자하는 스킬이 선수강되어야할 스킬이 아닌 경우)
s가 skill에 포함된다면
- 선수강을 건너띄고 수강하는 경우이므로 허용될 수 없는 스킬트리이다. 따라서 available 변수의 값을 false로 바꾼 뒤 break로 반복문을 탈출한다.
s가 skill에 포함되지 않는다면
- 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있기 때문에 아무런 조치를 취하지 않는다.
- currentSkill == targetSkill (현재 수강하고자하는 스킬이 선수강되어야할 스킬과 같은 경우)
- 선수강 스킬 스택의 첫번째 원소를 꺼내어 다음 targetSkill로 배정해준다.
- currentSkill ≠ targetSkill (현재 수강하고자하는 스킬이 선수강되어야할 스킬이 아닌 경우)
- 위 3번 로직을 실행한 후 available 변수의 값이 true라면 가능한 스킬트리를 의미하는 것이므로 sum에 1을 더해준다.
💬 풀이
func solution(skill:String, skill_trees:[String]) -> Int {
var sum = 0
for tree in skill_trees {
var preSkillset = Array(skill).map{ String($0) }
var targetSkill = preSkillset.removeFirst()
var available = true
for currentSkill in tree {
if preSkillset.contains(String(currentSkill)) {
available = false
break
}
if String(currentSkill) == targetSkill && preSkillset.count > 0 {
targetSkill = preSkillset.removeFirst()
}
}
sum += available ? 1 : 0
}
return sum
}