공부 기록/알고리즘 풀이

[Programmers | Lv.2] 스킬트리

IsItGettingBetter? 2024. 1. 2. 21:19

[문제 요약]

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

  • 스킬은 알파벳 대문자로 표기
  • 스킬 순서와 스킬트리는 문자열로 표기
  • skill의 길이는 1-26, 중복된 스킬 없음
  • skill_trees는 길이 1-20의 배열이며, 그 원소는 길이가 2 이상 26 이하인 중복 없는 문자열

[내 풀이]

def available(skill, tree):
    arr = [-1] * len(skill)
    for i, s in enumerate(skill):
        for j, t in enumerate(tree):
            if t==s:
                if i==0 or -1<arr[i-1]<j:
                    arr[i]=j
                else:
                    return False
    return True

def solution(skill, skill_trees):
    answer = 0
    s_num = len(skill)
    for tree in skill_trees:
        if available(skill, tree):
            answer+=1
    return answer

지저분하긴 한데 적당하게 풀었다고 생각했는데... 역시 나는 아직 갈 길이 먼 것을 깨달았다.

뒤에 따라올 다른 사람의 풀이를 보니..

 

 

[다른 사람의 풀이]

def solution(skill,skill_tree):
    answer=0
    for i in skill_tree:
        skillist=''
        for z in i:
            if z in skill:
                skillist+=z
        if skillist==skill[0:len(skillist)]:
            answer+=1
    return answer

(다른 사람의 풀이 너무 깔끔해서 부러움... 저런 스킬을 익히고 싶다.)

파이썬 그래도 잘 아는 편이라고 생각했는데, for-else문, while-else문을 처음 알게 되었다.

for, while 등의 반복문에서의 else는 반복하다가 break를 만나 반복이 중지되면 실행되지 않고, break를 만나지 않고 반복을 모두 마쳤을 경우 마지막에 실행된다고 한다. 모든 조건을 만족했을 때 카운트하는 이 문제와 같은 경우에서 유용하게 사용할 수 있을 듯 하다.

그리고 skilllist 문자열을 새로 생성해서 만드는 것도, 또 다른 사람의 풀이에서의 list()와 pop()을 사용하는 풀이보다 더 효율적이고 명확한 것 같아서 좋았다.

 

출처

문제: https://school.programmers.co.kr/learn/courses/30/lessons/49993

for-else, while-else문: https://wikidocs.net/190098