문제
선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다.
예를 들어 선행 스킬 순서가스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다.
위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만,썬더 → 스파크나라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다.
선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요.
제한사항
- 스킬은 알파벳 대문자로 표기하며, 모든 문자열은 알파벳 대문자로만 이루어져 있습니다.
- 스킬 순서와 스킬트리는 문자열로 표기합니다.
- 예를 들어,C → B → D라면CBD로 표기합니다
- 선행 스킬 순서 skill의 길이는 1 이상 26 이하이며, 스킬은 중복해 주어지지 않습니다.
- skill_trees는 길이 1 이상 20 이하인 배열입니다.
- skill_trees의 원소는 스킬을 나타내는 문자열입니다.
- skill_trees의 원소는 길이가 2 이상 26 이하인 문자열이며, 스킬이 중복해 주어지지 않습니다.
입출력 예시
skill = "CBD"
skill_tress = ["BACDE", "CBADF", "AECB", "BDA"]
=> return 2
나의 풀이
def solution(skill, skill_trees):
answer = 0
for i in range(0,len(skill_trees),1):
skill_trees[i] = ''.join(c for c in skill_trees[i] if c in skill)
for k in skill_trees:
if k == skill[0:len(k)] :
answer +=1
return answer
skill에 주어진 스킬 순서가 중요한 문제이다. 그리고 skill에 주어지지 않은 다른 스킬들은 순서에 상관없이 배울 수 있기 때문에 문제를 풀 때 skill에 주어지지 않은 스킬들은 제거하고 시작을 했다. 처음 for문을 보면 join문을 이용했는데, join는 리스트를 특정 문자열을 포함해 문자열로 반환해주는 함수이다. 내가 만든 join문을 보면 먼저 skill_tress에서 하나씩 스킬 트리를 뺀다. 예시로 "BACDE"를 보자면 "BACDE"에서 for 문을 통해 순서대로 "B", "A", "C", "D", "E"가 c가 된다. 그래서 만약 c가 skill인 "CBD" 중에 한 알파벳이라면 문자열에 들어가는 것이다. 저 join문을 통해 "BACDE"는 "BCD"가 된다.
이제 주어지지 않은 스킬들을 다 제거했다면 그들만을 가지고 다시 for문을 돌린다. 두번째 for문에서는 선행 스킬이 잘 이뤄지고 있는지를 판단하는 것이다. 이제 남은 알파벳들은 모두 skill에 있는 알파벳이니깐 순서만 판단하면 된다. 현재 "BACDE"는 제거를 통해 "BCD"가 되었는데, B는 C를 먼저 배운 다음에 쓸 수 있는 스킬이기 때문에 틀린 스킬 트리가 돼야 한다. 그래서 skill을 슬라이싱을 이용해 같은 길이로 잘라주었다. 여기서 중요한 점은 슬라이싱을 0에서부터 시작하는 것이다. 선행을 해야 하기 때문에 꼭 0부터 시작하는 게 중요하다. 그래서 만약 같은 길이로 만들었을 때, 두 개가 같다면 가능한 스킬 트리가 되는 것이다.
참고
[Python] Join, Split 리스트를 문자열로, 문자열을 리스트로 변환
[Python] Join, Split 리스트를 문자열로, 문자열을 리스트로 변환
들어가며 파이썬에 내장되어 있는 함수 join, split을 이용해 문자열(String)을 리스트(List)로 변환하는 방법입니다. Join 함수는 리스트를 특정 구분자를 포함해 문자열로 변환해 주는 함수입니다. Spl
ourcstory.tistory.com
'Develop > Algorithm' 카테고리의 다른 글
[Algorithm/Python] 파이썬 2진수 변환 다양한 풀이 (Convert decimal to binary in python) (3) | 2021.03.04 |
---|---|
[Algorithm/Python] 파이썬 약수 구하기 (시간복잡도 줄여보기) (0) | 2021.03.03 |
[Python/프로그래머스/Level3] 최고의 집합 (0) | 2021.02.23 |
[Python/프로그래머스/Level2/KAKAO] n진수 게임 (1) | 2020.10.25 |
[Python/프로그래머스/Level1] 실패율 - 2019 KAKAO BLIND RECRUITMENT (0) | 2020.09.17 |
Comment