본문 바로가기
Algorithm

[프로그래머스] 스킬트리 파이썬

by YGSEO 2021. 3. 3.
728x90
def solution(skill, skill_trees):
    
    flag = 0
    
    for trees in skill_trees:
      skill_check = []
      
      for a in trees:
        if a in skill:
          skill_check.append(a)

      
      for i, v in enumerate(skill_check):
        if v != skill[i]:
          flag += 1
          break
    
    
    return len(skill_trees) - flag

solution("CBD",	["BACDE", "CBADF", "AECB", "BDA"])

 

가장 생각이 안났던 부분은 check 리스트의 길이가 skill 리스트 보다 짧을 경우 어떻게 처리해야되는가 였는데

그냥 check_list 만 순회하면서 값을 비교하면 되니까 문제가 없다.

 

- 각 스킬트리의 element마다 skill 에 있는 element가 있으면 skill_check 에 저장

- skill_check 리스트를 순회하면서 skill 리스트의 값과 비교 후 다르면 flag에 1씩 추가

 


pop을 이용한 풀이

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

각각의 skill tree의 element에 대해(skills) 탐색

skills의 string을 하나씩 skill과 비교하면서, skills의 char가 skill에 있다면,

skill_list라는 비교 리스트의 맨처음 element와 비교,

여기서 pop를 사용해서 비교하면 for loop을 안써도 됨.

만약 pop한 char와 skills의 s가 다르다면 스킬트리 규칙에 어긋나기 때문에 해당 스킬 트리 리스트의 element 탐색 종료하고 다음 element를 탐색

else문은 for-else를 사용해서 for 문에 제대로 돌아갔다면, 즉, 스킬 트리 규칙에 맞다면 answer += 1

 

[Tips]

- pop을 사용해서 비교하는 방법

- for-else문을 사용하는 방법

728x90

댓글