[알고리즘] 프로그래머스_구현_스킬트리_코드주석

geunahellie·2023년 8월 26일
0

Algorithm

목록 보기
2/4
post-thumbnail

Hi, there!

오늘 정리하는 문제는 큐와 관련된 스킬트리 문제이다.

🔹 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

👉 알고가자

from collections import deque

📌 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-else문

for <조건>:
	if <반복문을 탈출할 조건>: 
    	break
    <반복문에서 작업할 내용>
else:
	<반복문이 끝까지 실행되었을 때 수행할 내용>

# 출처: 프로그래머스 코딩테스트 문제풀이전략 p.523

break문

  • break 문은 현재 실행 중인 반복문을 즉시 종료하고, 해당 반복문 블록 바로 다음의 코드로 이동
  • 따라서 break가 실행되면 현재 반복문의 나머지 부분은 실행되지 않음
  • break가 실행되지 않는 한, for 루프는 주어진 시퀀스의 모든 항목에 대해 계속 반복

else:

  • else: 문은 for 루프가 완전히 실행된 경우(즉, break에 의해 중단되지 않은 경우)에만 실행

📌 출처_코딩친구인 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 

🦘 take care!

profile
딱복 좋아하는 성실한 완료주의자

0개의 댓글