[프로그래머스/Lv2] 스킬트리
문제
선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻한다.
예를 들어 선행 스킬 순서가 스파크 -> 라이트닝 볼트 -> 썬더 일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 한다.
위 순서에 없는 다른 스킬은 순서에 상관없이 배울 수 있다.
선행 스킬 순서 skill과 유저들이 만든 스킬트리를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 반환하는 함수를 만들어야 한다.
제한사항
1. 스킬은 알파벳 대문자로 표기하며, 모든 문자열은 알파벳 대문자로만 이루어져 있다.
2. 스킬 순서와 스킬트리는 문자열로 표기한다.
-> 예를 들어, C -> B -> D 라면 "CBD"로 표기한다.
3. 선행 스킬 순서 skill의 길이는 1 이상 26 이하이며, 스킬은 중복해 주어지지 않는다.
4. skill_trees는 길이 1 이상 20 이하인 배열이다.
5. skill_trees의 원소는 스킬을 나타내는 문자열이다.
-> skill_trees의 원소는 길이가 2 이상 26 이하인 문자열이며, 스킬이 중복해 주어지지 않는다.
코드
import re
def solution(skill, skill_trees):
def find_skill(skill, skill_tree):
p = re.compile(f'[{skill}]')
return p.findall(skill_tree)
answer = 0
for skill_tree in skill_trees:
ex_skill_tree = find_skill(skill, skill_tree)
check = True
for i in range(len(ex_skill_tree)):
if ex_skill_tree[i] != skill[i]:
check = False
break
if check == False:
continue
else:
answer += 1
return answer
설명
import re
def find_skill(skill, skill_tree):
p = re.compile(f'[{skill}]')
return p.findall(skill_tree)
스킬 순서에 포함되지 않는 스킬들은 문제를 푸는데 아무런 역할을 하지 않기 때문에 제거해줄 것이다.
정규표현식을 통해 주어진 skill 문자열에 들어있는 문자만 뽑아서 반환하는 함수이다.
answer = 0
for skill_tree in skill_trees:
ex_skill_tree = find_skill(skill, skill_tree)
skill_trees의 원소(skill_tree)를 하나씩 꺼내며 반복한다.
find_skill함수에 skill과 skill_tree를 매개변수로 주어 반환된 리스트를 ex_skill_tree에 저장한다.
check = True
for i in range(len(ex_skill_tree)):
if ex_skill_tree[i] != skill[i]:
check = False
break
if check == False:
continue
else:
answer += 1
check는 바깥쪽 반복문의 진행을 결정할 변수이다.
ex_skill_tree의 길이만큼 반복한다.
만약 ex_skill_tree의 i번째 원소가 skill의 i번째 원소와 같지 않다면(순서가 틀리다면)
check를 False로 바꾸고 안쪽 반복문을 강제 종료한다.
안쪽 반복문 밖에서 check가 만약 False인 상태라면 아무런 동작없이 바깥 반복문을 실행한다.
그렇지 않다면 answer에 1을 더한다(순서가 알맞음).
return answer
answer를 반환한다.
'코딩테스트 > 연습문제' 카테고리의 다른 글
[프로그래머스/Lv2] 방문 길이 (0) | 2022.11.17 |
---|---|
[프로그래머스/Lv2] 땅따먹기 (0) | 2022.11.16 |
[프로그래머스/Lv2] [1차] 프렌즈4블록 (0) | 2022.11.14 |
[프로그래머스/Lv2] [3차] n진수 게임 (1) | 2022.11.14 |
[프로그래머스/Lv2] 피로도 (0) | 2022.11.10 |