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

최더디·2021년 1월 26일
0
post-thumbnail

📃 문제 설명

선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다.

예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다.

위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다.

선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요.

제한 조건

  • 스킬은 알파벳 대문자로 표기하며, 모든 문자열은 알파벳 대문자로만 이루어져 있습니다.
  • 스킬 순서와 스킬트리는 문자열로 표기합니다.
    예를 들어, C → B → D 라면 CBD로 표기합니다
  • 선행 스킬 순서 skill의 길이는 1 이상 26 이하이며, 스킬은 중복해 주어지지 않습니다.
  • skill_trees는 길이 1 이상 20 이하인 배열입니다.
  • skill_trees의 원소는 스킬을 나타내는 문자열입니다.
    skill_trees의 원소는 길이가 2 이상 26 이하인 문자열이며, 스킬이 중복해 주어지지 않습니다.

입출력 예

skillskill_treesreturn
"CBD"["BACDE", "CBADF", "AECB", "BDA"]2

입출력 예 설명

  • BACDE: B 스킬을 배우기 전에 C 스킬을 먼저 배워야 합니다. 불가능한 스킬트립니다.
  • CBADF: 가능한 스킬트리입니다.
  • AECB: 가능한 스킬트리입니다.
  • BDA: B 스킬을 배우기 전에 C 스킬을 먼저 배워야 합니다. 불가능한 스킬트리입니다.

💻 문제 풀이

def solution(skill, skill_trees):
    count = 0
    for skill_tree in skill_trees:
        s = ""                      # 하나의 스킬트리를 뽑을 때마다 s 초기화
        for ch in skill_tree:       
            if ch in skill:         # 스킬트리 중에 skill이 있다면 s에 추가
                s += ch
        
        if skill[:len(s)] == s:     # 만든 s를 기준으로 skill과 같다면 count += 1
            count += 1
    
    return count

#test case
print(solution("CBD", ["BACDE", "CBADF", "AECB", "BDA"])) # 2
print(solution("ABC", ["DEF"]))     # 1
print(solution("CBD", ["CAD"]))     # 0
print(solution("CBD", ["AEF", "ZJW"]))  # 2
print(solution("REA", ["REA", "POA"]))  # 1
print(solution("CBDK", ["CB", "CXYB", "BD", "AECD", "ABC", "AEX", "CDB", "CBKD", "IJCB", "LMDK"]))  # 4
print(solution("BDC", ["AAAABACA"]))    # 0
print(solution("CBD", ["C", "D", "CB", "BDA"])) # 2

중요 포인트

  • 하나의 스킬트리에서 선행스킬 순서에 존재하는 것들만 s에 추가한다.
  • 만들어진 s의 길이를 기준으로 선행스킬 순서를 자른다.
  • 선행스킬 "ABC", 스킬트리 ["DEF"] 면 답이 1이다. (=아무런 영향을 끼치지 않는다)

처음 작성한 코드

  • index값을 따로 생성하여 s에 들어올 때 skill의 인덱스와 같지 않다면 s를 -1로 만들어 오류가 났다는 걸 파악.
def solution(skill, skill_trees):
    count = 0
    for skill_tree in skill_trees:
        s = ""                                  # 하나의 스킬트리를 뽑을 때마다 s, index 초기화
        index = 0                   
        for ch in skill_tree:
            if ch in skill:                     # 스킬트리에 skill이 있다면 s에 추가
                s += ch
                if s[index] != skill[index]:    # 인덱스 값이 다르다면 s를 -1 변경 후 break
                    s = "-1"
                    break
                index += 1                      # s[index]==skill[index] 면 index값 +1
        if s != "-1":                           # s가 -1이 아니라면(=제대로 된 스킬트리라면) count += 1
            count += 1
    
    return count
profile
focus on why

0개의 댓글