문제 설명
선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다.
예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일 때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다.
위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크나 라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다.
선행 스킬 순서 skill과 유저들이 만든 스킬트리를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요.
제한 조건
- 스킬은 알파벳 대문자로 표기하며, 모든 문자열은 알파벳 대문자로만 이루어져 있습니다.
- 스킬 순서와 스킬트리는 문자열로 표기합니다. 예를 들어, C -> B -> D 라면 "CBD"로 표기합니다.
- 선행 스킬 순서 skill의 길이는 1 이상 26 이하이며, 스킬은 중복해 주어지지 않습니다.
- skill_trees는 길이 1 이상 20 이하인 배열입니다.
- skill_trees의 원소는 스킬을 나타내는 문자열입니다. skill_trees의 원소는 길이가 2 이상 26 이하인 문자열이며, 스킬이 중복해 주어지지 않습니다.
입출력 예
제출 코드
def solution(skill, skill_trees):
count = 0
for i in range(len(skill_trees)):
status = 0
check = True
for j in range(len(skill_trees[i])):
if skill_trees[i][j] in skill:
if skill.index(skill_trees[i][j]) != status:
check = False
break
else:
status += 1
if check == True:
count += 1
return count
(1) line 2
가능한 스킬트리 개수를 세기 위해 변수 count를 선언한다.
(2) line 3
유저들이 만든 스킬트리를 담은 배열 skill_trees 내의 모든 스킬트리를 확인해야 하기 때문에 반복 횟수는 len(skill_trees)이다.
(3) line 4, 5
유저들이 만든 스킬트리가 선행 스킬 순서를 잘 지키고 있나 확인하기 위해 선언된 변수 status는, 선행 스킬 순서 'skill'의 인덱스와 비교하기 위해 사용된다. 또한, 유저들이 만든 스킬트리가 선행 스킬 순서를 어겼는지 상태를 반영하기 위해 check라는 bool 형태의 변수를 선언한다.
(4) line 6
유저들이 만든 스킬트리에서 스킬 순서를 확인하기 위해 스킬 개수 'skill_trees[i]' 만큼 반복 횟수를 지정한다.
(5) line 7
어떤 스킬이든 선행 스킬 순서 'skill' 안에 없다면 언제든 배워도 괜찮다. 그렇기 때문에 선행 스킬 순서 'skill' 안에 있는지 우선적으로 확인한다.
(6) line 8 ~ line 10
line 7의 if문이 만족하여 line 8로 들어서면, 해당 스킬이 몇 번째 순서로 배워야 하는 스킬인지 skill.index(skill_trees[i][j]) 를 통해 파악한다. 그것이 status와 같지 않다면 선행 스킬 순서를 어긴 것이 되므로 check를 False로 바꾸고 skill_trees[i]에 해당하는 스킬트리를 그만 파악하도록 break를 걸어준다. 더 이상 볼 필요가 없기 때문이다.
(7) line 11, 12
만약 선행 스킬 순서를 잘 지키고 있는 것이라면, 그 다음 순서의 스킬을 배워야 하므로 status를 1 증가시킨다. 이후 skill_trees[i]에 해당하는 스킬트리에서 그 다음 스킬을 확인하러 반복문이 다시 실행된다.
(8) line 13, 14
skill_trees[i]에 해당하는 스킬트리 내 모든 스킬을 확인했거나, 도중에 break를 통해 for문이 종료되었다면 13번 line으로 오게 된다. 이때 check를 확인하여 True라면 skill_trees[i]는 가능한 스킬트리라는 이야기이므로 count를 1 증가시킨다. 이후 그 다음 스킬트리를 확인하기 위해 반복문이 또다시 실행된다.
이번 문제는 뭔가 이상하게 말로 설명하기가 살짝 힘들다. 제대로 설명이 되었는지 모르겠다.ㅠㅠ
Source : https://programmers.co.kr/learn/courses/30/lessons/49993
'PS > 프로그래머스' 카테고리의 다른 글
[프로그래머스][파이썬/Python] 프린터 (0) | 2020.03.08 |
---|---|
[프로그래머스][파이썬/Python] 시저 암호 (0) | 2020.03.07 |
[프로그래머스][파이썬/Python] 쇠막대기 (0) | 2020.03.05 |
[프로그래머스][파이썬/Python] (2018 카카오 코딩테스트) 비밀지도 (0) | 2020.03.04 |
[프로그래머스][파이썬/Python] 2016년 (0) | 2020.03.03 |