프로그래머스 Lv2 구현 문제입니다. 실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.
문제
https://school.programmers.co.kr/learn/courses/30/lessons/49993
[나의 풀이]
⌛ 12분
def solution(skill, skill_trees):
answer = len(skill_trees)
for skill_tree in skill_trees:
skill_set = set(skill)
tmp = []
for x in skill_tree:
if x in skill_set:
tmp.append(x)
tmp = "".join(tmp)
for i in range(len(tmp)):
if tmp[i]!=skill[i]:
answer -= 1
break
return answer
배워야하는 스킬 순서(skill)과 유저가 만든 스킬트리들(skill_trees)가 입력될 때, 가능한 스킬트리의 갯수를 판별하는 문제입니다.🐈🐈🐈
먼저 유저가 만든 스킬트리들(skill_trees)가 모두 가능하다고 가정하고 answer를 최댓값으로 지정합니다.
각 스킬트리(skill_tree)에서 하나하나 배워야하는 스킬 순서(skill)를 확인해야하므로 먼저 2중 for문으로 구현해준 뒤, 현재 스킬이 set형태의 배워야하는 스킬(skill_set) 목록에 있다면 순서대로 추가해줍니다(tmp).
이후 tmp를 배워야하는 스킬 순서(skill)와 비교하며 순서가 하나라도 다를 시 이를 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
list.pop(0) 과, for-else문을 활용한 풀이입니다.
먼저 유저가 만든 스킬트리들(skills), 각 스킬트리의 스킬을 돌기 위해 2중 for문을 구현하여 배워야하는 스킬 순서(skill_list)를 확인하는데는 동일하지만, 이 배워야하는 스킬 순서(skill_list)를 확인할 때 list.pop(0)하여 확인함과 동시에 제거하는 방식이 달랐습니다.🦢🦢🦢
또 for - else 문법은 처음보는 형태였는데 for문이 break없이 돌아갔을 때 실행되는 것으로, 배워야하는 스킬 순서가 모두 맞았을 때 answer에 추가하는 식이였습니다.
[다른 사람의 풀이2]
def solution(skill, skill_trees):
count = 0
for skill_tree in skill_trees:
s = "" # 하나의 스킬트리를 뽑을 때마다 s 초기화
for ch in skill_tree:
if ch in skill: # 스킬트리 중에 skill이 있다면 s에 추가
s += ch
if skill[:len(s)] == s: # 만든 s를 기준으로 skill과 같다면 count += 1
count += 1
return count
배워야하는 스킬 순서(skill)과 유저가 만든 스킬트리에서의 배워야 하는 스킬(s)을 비교할 때 s의 크기를 기준으로 인덱싱하여 구현한 풀이입니다.🐵🐵🐵
감사합니다.