문제

문제

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

 

코딩테스트 연습 - 스킬트리

 

programmers.co.kr

 

처음 작성한 코드

def solution(skill, skill_trees):
    answer = 0
    for i in skill_trees:
        tmp = []
        flag = 1
        for j in skill:
            if j in i:
                if tmp:
                    if tmp[-1] > i.index(j):
                        flag = 0
                        break
                tmp.append(i.index(j))
            else:
                tmp.append(len(i))
        if flag:
            answer+=1
    return answer
  1. skill을 still_trees에서 찾고 그 인덱스를 저장해뒀다가 비교후에 tmp에 넣는다. 만약 B의 인덱스보다 C의 인덱스가 뒤에 있다면 B를 먼저 배우게 되니까 조건에 충족되지 못하기 때문에 flag를 0으로 하고 break를 하여 tmp에 추가하지 않는다.
  2. if j in i 의 else에 tmp.append(len(i))를 한 이유는 CD와 같은 스킬트리를 막기 위해서이다. 스킬이 스킬트리에 없으면 length를 넣어서 비교할 때 if문에 항상 참이되도록 하여 break 하기 위해서 코드를 작성했다.

 

코드 리뷰 후

def solution(skill,skill_trees):
    from collections import deque
    answer = 0
    for i in skill_trees:
        skillList = deque(skill)
        for j in i:
            if j in skill:
                if skillList.popleft() != j: break
        else: answer+=1
    return answer
  1. 스킬트리를 돌면서 스킬트리가 스킬에 있고, 스킬의 맨 앞 즉 순서대로 존재하면 answer+=1 하는 식으로 작성했다.

 

깨달은 점

  • for-else 좋다.
  • 처음 작성한 코드랑 다른 사람의 코드 로직이 완전 반대이다. 신기하다.. 

'Programmers' 카테고리의 다른 글

[프로그래머스] 메뉴 리뉴얼  (0) 2021.01.25
[프로그래머스] 수식 최대화  (0) 2021.01.25
[프로그래머스] 압축  (0) 2021.01.22
[프로그래머스] 후보키  (0) 2021.01.22
[프로그래머스] 오픈채팅방  (0) 2021.01.19