선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다.
예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다.
위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크나 라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다.
선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요.
def solution(skill, skill_trees):
answer = 0
for i in skill_trees:
temp = list(skill)
flag = True
for item in i:
if item in temp:
if item != temp[0]:
flag = False
break
else:
temp.pop(0)
if flag:
answer +=1
return answer
크게 어렵지 않게 풀 수 있었다.
for문을 돌면서 검사를 하고 순서가 맞으면 skill에서 pop하고 그렇지않으면 검사를 종료하고 flag=False
설정을 해서 카운트를 못세게 했다.
이 풀이를 보고 python에서 for ~ else ~
를 사용하면 for문에서 break에 의해 멈춰지지 않으면 else
이하 구문을 실행한다는 것을 알게 되었다.
내가 flag로 처리하는것을 한방에 처리할 수 있는 문법이어서 신박했다. 자주 써먹어야지
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
이건 인덱싱으로 풀이를 한 코드라서 내꺼보다 많은 자원을 소모하지 않고 풀이를 할 수 있던 코드같다.
왜냐하면 나는 매번 새로운 skill 인스턴스를 만들고 비교해서 빼주고 flag라는 신호도 줘야했다.
하지만 이 코드는 skillist
에 스킬트리를 만들고 원래 skill
과 같은 길이의 인덱스까지만 비교해서 맞는지를 확인했다.
훨씬 더 직관적인 코드인것같다. 인덱싱을 좀 더 적극적으로 활용해볼 필요가 있는것같다.
def solution(skill,skill_tree):
answer=0
for i in skill_tree:
skillist=''
for z in i:
if z in skill:
skillist+=z
if skillist==skill[0:len(skillist)]:
answer+=1
return answer