티스토리 뷰

https://school.programmers.co.kr/learn/courses/30/lessons/131704

 

프로그래머스

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

programmers.co.kr


1. 풀이

  • 메인 컨베이어 벨트에서 꺼내는 택배 상자 번호를 n으로 두자.

택배 상자는 번호 증가 순으로 메인 컨베이어 벨트에서 내릴 수 있다. 따라서 n = 1로 초기화하고, 보조 컨베이어 벨트나 트럭에 실을 때마다 1씩 증감해주자.

 

 

  • 보조 컨베이어 벨트는 스택 자료 구조이다.

보조 컨베이어 벨트에 마지막으로 보관한 상자부터 꺼낼 수 있다. Last In, Last Out. 스택 자료 구조이다.

 

 

  • (1단계) 메인 컨베이어 벨트에서 꺼내는 상자와 현재 기사님이 원하는 상자 번호가 동일할 때까지 보조 컨베이어 벨트에 담자.

일단 원하는 상자 번호가 나올 때까지 보조 컨베이어 벨트에 담는다. 단, 메인 컨베이어 벨트에선 번호 증가 순으로 상자가 나오기 때문에 기사님이 원하는 상자 번호보다 작은 것들만 보조 컨베이어 벨트에 담아야 한다.

만약 메인 컨베이어 벨트에서 꺼내는 상자 번호가 기사님이 원하는 상자 번호와 동일하다면, 기사님이 원하는 다음 상자 번호에 대해 위와 같은 작업을 반복한다. 만약 메인 컨베이어 벨트에서 꺼내는 상자가 기사님이 원하는 상자 번호보다 크다면 이제 보조 컨베이어 벨트에서 적절한 택배를 찾아야 한다.

 

 

  • (2단계) 보조 컨베이어 벨트에 마지막으로 넣은 택배 상자 번호가 기사님이 원하는 상자 번호와 동일한가?

기사님이 원하는 상자 번호의 택배를 찾기 위해 메인 컨베이어 벨트에서, 이제 보조 컨베이어 벨트에 온 상황이다. 만약 보조 컨베이어 벨트에 마지막으로 넣은 택배 상자 번호가 기사님이 원하는 번호라면 다시 (1단계)부터 반복하면 된다. 그러나 서로 다른 번호라면, 더 이상 트럭에 택배를 실을 수 없으므로 그대로 종료된다.

 

 

 

2. 정답 코드

def solution(order):
    length = len(order)
    n = 1
    stack = []
    
    answer = 0
    for o in order:
        while n < o:
            stack.append(n)
            n += 1
        
        if n == o:
            answer += 1
            n += 1
            continue
        
        if stack.pop() == o:
            answer += 1
            continue
        
        break
    
    return answer
728x90