1. 문제
https://programmers.co.kr/learn/courses/30/lessons/49993
2. 풀이 방법
- 알파벳 순서를 배열에 기록합니다.
- skill tree를 하나하나 살펴보면서
- 배열에 기록된 단어가 아니면(스킬 순서가 없으면), 건너 뜁니다.
- 배열에 기록된 단어이면서
- 아직 사용한 스킬이 없으면, 0번째 스킬로 갱신합니다.
- 0번째 스킬이 아닌 경우, 이전에 사용한 스킬과 값이 1 차이가 나는지 확인합니다.
3. 소스코드
3.1. 내가 푼 소스코드
def solution(skill, skill_trees):
# 알파벳 순서 기록
skill_order = [-1] * 26
for i, x in enumerate(skill):
skill_order[ord(x) - ord('A')] = i
answer = 0
# 사용한 넘버보다 최신이면 x
for each_tree in skill_trees:
top_order = -1
is_answer = True
for i, x in enumerate(each_tree):
# 순서 상관 없는 스킬은 건너 뜀
if skill_order[ord(x) - ord('A')] == -1:
continue
# 순서가 상관 있는 경우, 아직 사용한 스킬이 없으면 0번째 skill인지 확인 후 갱신
if top_order == -1 :
if skill_order[ord(x) - ord('A')] != 0:
is_answer = False
break
top_order = skill_order[ord(x) - ord('A')]
continue
# 다음 스킬은 반드시 이전에 쓴 스킬 다음이어야 하기 때문에, 순서가 1 차이나는지 확인
if skill_order[ord(x) - ord('A')] - top_order == 1:
top_order = skill_order[ord(x) - ord('A')]
print(x)
else:
is_answer = False
break
if i == len(each_tree) - 1 and is_answer:
print(each_tree, i)
answer += 1
return answer
3.2. 숏코딩 by programmers
- for-else 문을 사용하여 문제를 보다 쉽게 해결하였습니다.
- pop(0)을 사용하여 가장 좌측에 있는 스킬인지 확인하였습니다.
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