프로그래머스 스킬트리 (Python)

박노정·2021년 6월 18일
0

알린이의 알고리즘

목록 보기
7/15
post-custom-banner

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

선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다.
예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다.
위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크나 라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다.
선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요.

내 풀이

def solution(skill, skill_trees):
    answer = 0
    
    for i in skill_trees:
        temp = list(skill)
        flag = True
        for item in i:
            if item in temp:
                if item != temp[0]:
                    flag = False
                    break
                else:
                    temp.pop(0)
        if flag:
            answer +=1
    return answer

크게 어렵지 않게 풀 수 있었다.
for문을 돌면서 검사를 하고 순서가 맞으면 skill에서 pop하고 그렇지않으면 검사를 종료하고 flag=False 설정을 해서 카운트를 못세게 했다.

다른 사람의 풀이 -1

이 풀이를 보고 python에서 for ~ else ~를 사용하면 for문에서 break에 의해 멈춰지지 않으면 else이하 구문을 실행한다는 것을 알게 되었다.
내가 flag로 처리하는것을 한방에 처리할 수 있는 문법이어서 신박했다. 자주 써먹어야지

def solution(skill, skill_trees):
    answer = 0

    for skills in skill_trees:
        skill_list = list(skill)

        for s in skills:
            if s in skill:
                if s != skill_list.pop(0):
                    break
        else:
            answer += 1

    return answer

다른 사람의 풀이 -2

이건 인덱싱으로 풀이를 한 코드라서 내꺼보다 많은 자원을 소모하지 않고 풀이를 할 수 있던 코드같다.
왜냐하면 나는 매번 새로운 skill 인스턴스를 만들고 비교해서 빼주고 flag라는 신호도 줘야했다.
하지만 이 코드는 skillist에 스킬트리를 만들고 원래 skill과 같은 길이의 인덱스까지만 비교해서 맞는지를 확인했다.
훨씬 더 직관적인 코드인것같다. 인덱싱을 좀 더 적극적으로 활용해볼 필요가 있는것같다.

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
profile
성장스택 쌓고있는 개발자🏋
post-custom-banner

0개의 댓글