개발 블로그
[Programmers/파이썬] 프로그래머스(Lv.2) 스킬트리 문제풀이 본문
문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/49993
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다.
예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다.
위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크나 라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다.
선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요.
제한 조건
- 스킬은 알파벳 대문자로 표기하며, 모든 문자열은 알파벳 대문자로만 이루어져 있습니다.
- 스킬 순서와 스킬트리는 문자열로 표기합니다.
- 예를 들어, C → B → D 라면 "CBD"로 표기합니다
- 선행 스킬 순서 skill의 길이는 1 이상 26 이하이며, 스킬은 중복해 주어지지 않습니다.
- skill_trees는 길이 1 이상 20 이하인 배열입니다.
- skill_trees의 원소는 스킬을 나타내는 문자열입니다.
- skill_trees의 원소는 길이가 2 이상 26 이하인 문자열이며, 스킬이 중복해 주어지지 않습니다.
사고 흐름
1. 문자열 비교 문제라서 자연스럽게 투포인터 생각
2. 근데 두 문자열을 비교하는 문제라서 투포인터보다는 스택같은 구조 생각
3. 스킬 조건을 정리하면 1) 앞에서부터 2) 차례대로 있어야 한다, 즉 문자의 순서가 중요하다!
4. 선행 스킬 조건에 있는 것이라면 pop으로 마지막것과 비교하는 흐름 생각
문제 핵심과 알고리즘
def solution(skill, skill_trees):
answer = 0
for st in skill_trees :
temp = list(skill)[::-1]
for s in st :
if s in temp :
if s==temp[-1] :
temp.pop()
else :
break
if s==st[-1] :
answer+=1
return answer
굳이 temp에서 반대로 (-1) 복사한 것은 pop을 사용할 때 효율적으로 빼라고 뒤집은 것이다. 스킬트리에서 선행 스킬 조건에 있는 스킬일 때, 마지막 것(pop)을 배워야 한다. (순서가 유지돼야 하므로) 그렇지 않으면 선행 스킬 조건을 순서대로 배운게 아니라 뒤에 있는 스킬을 배운 것이므로 break를 한다. 그리고 만약 스킬트리 문자열을 다 돌았다면 조건을 만족시킨것이므로 answer를 더한다.
문제 풀면서 헤맸던 부분
딱히 없었다
총평
처음에는 투포인터를 생각했지만, 이 문제는 두개의 문제열을 비교하는 문제이고, 비교하는 문자들의 순서가 중요하다는 것을 깨닫고 바로 스택으로 방향을 바꿨다. 이제 좀 감이 잡히는 것 같다.
'Algorithm' 카테고리의 다른 글
[Programmers/파이썬] 프로그래머스(Lv.2) 문자열 압축 문제풀이 (0) | 2024.08.16 |
---|---|
[Programmers/파이썬] 프로그래머스(Lv.2) 방문 길이 문제풀이 (0) | 2024.08.16 |
[Programmers/파이썬] 프로그래머스(Lv.2) 타겟 넘버 문제풀이 (0) | 2024.08.16 |
[Leetcode/파이썬] 3_Longest Substring Without Repeating Characters 문제풀이 (0) | 2024.08.15 |
[Leetcode/파이썬] 121_Best Time to Buy and Sell Stock 문제풀이 (0) | 2024.08.12 |