s5unnyjjj's LOG

[홀로 하는 코딩 공부] 택배상자(Python) 본문

Algorithm/Python

[홀로 하는 코딩 공부] 택배상자(Python)

s5unnyjjj 2024. 6. 13. 22:01

프로그래머스

사용 언어: Python

문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/131704

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

*** 본 문제를 푸는 과정을 공유하려 한다.


▶ order의 길이가 많이 크기에 해당 부분을 생각하며 코드를 작성한다. 문제 자체는 어렵지 않았기에 그냥 차근차근 작성해보았다.

from collections import deque

def solution(order):
    answer = 0
    
    assist_container = deque()
    len_order = len(order)
    
    idx = 1
    
    while idx <= len_order:
        target = order[0]
        if idx == target:
            idx += 1
            order.pop(0)
            answer += 1
        elif assist_container and assist_container[-1] == target:
            assist_container.pop()
            order.pop(0)
            answer += 1
        else:
            assist_container.append(idx)
            idx += 1
    while assist_container and order:
        assist_value = assist_container.pop()
        if assist_value == order[0]:
            answer += 1
            order.pop(0)
        else:
            break

    return answer

 

 

▶ 테스트 7,9,10에서 시간초과가 났다. order의 길이가 큰게 원인이다. 해당 부분을 해결하기 위해 코드를 다시 살펴본다. 보다보니 시간초과를 안 나게 하려고 deque를 사용하였는데, 입력으로 받는 order는 여전히 배열이다. order의 길이가 커서 시간초과가 났을 거라 판단하여 order 역시 deque 형태로 변형해준다.

from collections import deque

def solution(order):
    answer = 0

    order = deque(order)
    assist_container = deque()
    len_order = len(order)

    idx = 1

    while idx <= len_order:
        target = order[0]
        if idx == target:
            idx += 1
            order.popleft()
            answer += 1
        elif assist_container and assist_container[-1] == target:
            assist_container.pop()
            order.popleft()
            answer += 1
        else:
            assist_container.append(idx)
            idx += 1
    while assist_container and order:
        assist_value = assist_container.pop()
        if assist_value == order[0]:
            answer += 1
            order.popleft()
        else:
            break

    return answer

 

 

▶ 통과다!! 심지어 다른 테스트 케이스 소요 시간도 대폭 줄었다. deque를 잊지말자.


>> 위 내용은 필자가 코딩테스트 문제를 푼 코드입니다.

>> 부족한 점이 많을 수 있기에 잘못된 내용이나 궁금한 사항이 있으면 댓글 달아주시기 바랍니다.

>> 긴 글 읽어주셔서 감사합니다. 

 
반응형
Comments