STUDY/Algorithm

[프로그래머스] LEVEL2 스킬트리, python3, Summer/Winter Coding(~2018)

sinawi95 2021. 1. 28. 00:10
728x90
def solution(skill, skill_trees):
    answer = 0 

    for skill_tree in skill_trees:
        old_val = skill_tree.find(skill[0])     # 이전값과 비교하기 위한 변수. 처음 값은 skill의 첫 글자의 인덱스값
        for sk in skill[1:]:                    
            val = skill_tree.find(sk)           # val는 비교할 값의 인덱스 

            if old_val == -1:                   # 만약 old_val == -1 인 경우에는(스킬트리 내에 없음)
                if val != -1:                   #   다음값이 다 -1인 경우(스킬트리에 없는 경우)에만 진행
                    break                       #   하나의 값이 존재하면 불가능한 스킬트리
            else: # old_val > -1                # 이전값이 스킬트리 내에 있고
                if val < old_val:               #   현재 값이 이전값보다 작은 경우
                    if val == -1:               #     현재값이 스킬트리 내 없으면 가능
                        old_val = val
                    else:                       #     스킬트리내 있으면 불가능
                        break
                else:                           #   현재값이 이전값보다 큰 경우는 가능
                    old_val = val               
        else:
            answer += 1                         # break없이 돌았을경우 가능한 스킬트리
    return answer

 

꽤 오래 해멘 문제이다.

 

보자마자 인덱스 값으로 크기를 비교하면 쉽게 할수있을 것이라 생각했다

하지만 인덱스 값이 반환 되었을때와 반환이 되지 않았을 때(-1)가 있었기 때문에 단순하게 비교할수없었다.

약 한 두시간 정도 짱돌을 굴려봤는데 답이 도저히 나오지 않았고 그냥 조건을 덕지덕지 붙여서 사용했다.

풀긴 풀었지만 풀었다고 하기엔 좀 애매한 풀이이다

 

아래 다른 사람의 깔끔한 풀이도 첨부해놨다.

 

 


 


## 다른 사람의 풀이. 깔끔해서 가져왔다.
from collections import deque
def solution(skill, skill_trees):
    answer = 0

    for skill_tree in skill_trees:
        skill_list = deque(list(skill))
        for s in skill_tree:
            if s in skill:
                if s != skill_list.popleft():
                    break
        else:
            answer += 1

    return answer