[Swift] [39일차] 스킬트리

·2025년 1월 15일
0

SwiftAlgorithm

목록 보기
42/105
post-thumbnail

programmers-스킬트리

문제설명

  1. Skill이 주어지는데 그 스킬 알파벳순서대로 익힐 수 있다.
  2. 해당 알파벳빼고 그 순서 안지킨애들 아웃시켜주면 될 듯

문제 접근

  1. 근데 CBD라는게 주어졌을 때 이거 다 안나올 수도 있는데 그거에 대한 처리만 잘해주면 될 것 같음

문제풀이

  1. 처음에는 일단 스킬트리에서 주어진 스킬빼고 필요없는 것들은 다 filter로 지워줬다.
  2. 그리고 거기서 이제 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비교하면서 스킬 선후관계 비교하면 될 듯 ?


  1. 이제 여기에서 스킬습득근황 이라는 배열을 만들어줘서, 여기에서 선행을 판단하고자했다. skill.firstIndex(of: 배우고자하는 스킬) 을 찾으면 그 인덱스를 스킬습득근황에 비교하는 구조다.
  2. 처음 스킬은 바로 배울 수 있으니 따로 처리를 해주고, 현재테케라는 변수로 현재 스킬트리에서 배우고 있는 현황을 체크하고자 한것이다.
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) 이게 뭐지? 해서 좀 찾아봤다.

공식문서 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
profile
기억보단 기록을

0개의 댓글