programmers.co.kr/learn/courses/30/lessons/49993
문제 설명
선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다.
예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다.
위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크나 라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다.
선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요.
제한 조건
- 스킬은 알파벳 대문자로 표기하며, 모든 문자열은 알파벳 대문자로만 이루어져 있습니다.
- 스킬 순서와 스킬트리는 문자열로 표기합니다.
- 예를 들어, C → B → D 라면 "CBD"로 표기합니다
- 선행 스킬 순서 skill의 길이는 1 이상 26 이하이며, 스킬은 중복해 주어지지 않습니다.
- skill_trees는 길이 1 이상 20 이하인 배열입니다.
- skill_trees의 원소는 스킬을 나타내는 문자열입니다.
- skill_trees의 원소는 길이가 2 이상 26 이하인 문자열이며, 스킬이 중복해 주어지지 않습니다.
입출력 예
skill | skill_trees | return |
"CBD" | ["BACDE", "CBADF", "AECB", "BDA"] | 2 |
입출력 예 설명
- "BACDE": B 스킬을 배우기 전에 C 스킬을 먼저 배워야 합니다. 불가능한 스킬트립니다.
- "CBADF": 가능한 스킬트리입니다.
- "AECB": 가능한 스킬트리입니다.
- "BDA": B 스킬을 배우기 전에 C 스킬을 먼저 배워야 합니다. 불가능한 스킬트리입니다
문제 풀이
def solution(skill, skill_trees):
answer = 0
for tree in skill_trees:
skill_list = list(skill) # 스킬 학습 순서를 리스트에 저장
count = 0 # tree가 끝까지 돌아갔는지 확인을 위한 변수
for j in tree:
if j in skill and j != skill_list.pop(0):
break # j가 학습순서에 속하고, 지금의 스킬리스트 첫번째 값과 같지 않다면 break
count += 1 # 위 if문이 한번 반복할때마다 count + 1
if count == len(tree): # count가 tree의 길이만큼되면, answer + 1
answer += 1
return answer
스킬을 배운거는 리스트에서 지워가며 비교해본다는 생각으로 pop()함수를 이용했다.
for ~ if 등을 통해 스킬트리가 학습 순서에 올바른지 하나씩 확인해보는 방식으로 진행했으며,
count라는 변수를 통해 각 스킬트리가 정상적으로 for문을 통과하면 answer에 1을 더하는 식으로 코딩했다.
다른 사람의 문제풀이
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
다른 사람의 문제풀이를 보니, 지금까지 사용해본적 없던 for ~ else문의 개념을 알게되었다.
for문이 정상적으로 돌아간다면 (if의 조건에 걸리지 않아 break가 발동되지 않는다면)
그 때 else문을 실행시킬 수 있는 문법이다.
for ~ else문을 활용한다면, 더욱 간단명료한 코드를 만들 수 있을 것 같다.
'Minding's Programming > 프로그래머스 코딩테스트' 카테고리의 다른 글
[프로그래머스/코딩테스트/Python] 오픈채팅방 문제풀이 (0) | 2021.06.09 |
---|---|
[프로그래머스 / 코딩테스트/ Python] 메뉴 리뉴얼 문제풀이 (0) | 2021.04.15 |
[프로그래머스/코딩테스트/Python] 삼각 달팽이 문제풀이 (0) | 2021.04.01 |
[프로그래머스/코딩테스트/Python] 문자열 압축 문제풀이 (0) | 2021.03.29 |
[프로그래머스/코딩테스트/Python] 멀쩡한 사각형 문제풀이 (0) | 2021.03.22 |