오늘 정리하는 문제는 큐와 관련된 스킬트리 문제이다.
🔹 ch.12 구현
🔹 큐, deque
'프로그래머스 코딩테스트 문제 풀이 전략: 파이썬편'으로 알고리즘을 공부하고 있다. 직접 풀지 못한 문제들은 책의 풀이를 이해하고, 주석을 달면서 공부 중이다.
📌 출처: '프로그래머스 코딩테스트 문제 풀이 전략: 파이썬편', 김범수, 길벗
📌 프로그래머스 스킬트리 문제 바로가기 요기요기
💻 정답 코드
from collections import deque
def solution(skill, skill_trees):
answer = 0
for skills in skill_trees:
skill_list = deque(skill[:])
for s in skills:
if s in skill and s != skill_list.popleft(): break
else: answer += 1
return answer
📌 deque 관련해 참고한 유튜브
제주코딩베이스캠프_[유용한 Python 모듈 collections #3] deque
영상에서 나온 코드들을 따라 실습해보았다.
from collections import deque
a = [10,20,30,40,50]
d = deque(a)
print(a)
print(d)
# 출력
[10, 20, 30, 40, 50]
deque([10, 20, 30, 40, 50])
for <조건>:
if <반복문을 탈출할 조건>:
break
<반복문에서 작업할 내용>
else:
<반복문이 끝까지 실행되었을 때 수행할 내용>
# 출처: 프로그래머스 코딩테스트 문제풀이전략 p.523
break
가 실행되지 않는 한, for
루프는 주어진 시퀀스의 모든 항목에 대해 계속 반복📌 출처_코딩친구인 ChatGPT
💻 코드 주석
테스트할 입력 예시
skill = "CBD" skill_trees = ["BACDE", "CBADF", "AECB", "BDA"]
from collections import deque
def solution(skill, skill_trees):
answer = 0
for skills in skill_trees:
skill_list = deque(skill[:])
# for skills in skill_trees -> ["BACDE", "CBADF"...]
# skill_list = deque(['C', 'B', 'D'])
for s in skills:
# 1번째.
# for s in "BACDE"
# -> for "B" in "BACDE"
# 2번째.
# for "C" in "CBADF"
if s in skill and s != skill_list.popleft():
break
# 1번째.
# if "B" in "CBD" and "B" != "C" -> true
# -> break 실행
# -> "BACDE"에 대한 탐색을 마치고
# 다음 skill_trees에 있는 "CBADF" 탐색
# 2번째.
# skill_list = deque(['C', 'B', 'D'])
# 이유는 첫 skill_trees에서 for문을 아예 빠져 나온 뒤,
# 다음 skill_trees가 들어갈때는 skill_list deque이 재정의됨
# if "C" in "CBD" and "C" != "C" -> false
# -> break로 가지 않고 다음 원소 "B"에 대해 검사함
# if "B" in "CBD" and "B" != "B"
# -> skill_list.popleft() 두 번째 호출이라 ['B', 'D'] 중 'B'가 나옴
# -> false
# -> break로 가지 않고 다음 원소 "A"에 대해 검사함
# if "A" in "CBD"
# 이 조건에서 false라 더 이상 skill_list.popleft()가 호출되지 않음
# 다음 원소 "D"에 대해 검사함
# if "D" in "CBD" and "D" != "D" -> false
# -> break로 가지 않고 다음 원소 "F"에 대해 검사함
# if "F" in "CBD" -> false
# "CBADF"에 대해 for문이 끝남
# else문으로 이동
else:
answer += 1
return answer