ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 택배상자(python)
    Algorithm/프로그래머스_생각정리 2022. 10. 18. 17:33
    from collections import deque
    
    def solution(order):
        data = deque([i for i in range(1,len(order)+1)])
        sub_data = deque()
        answer = 0
        o = 0
        flag = 0
        s_flag = 0
        while True:
            if data:
                if order[o] > data[0]:
                    sub_data.appendleft(data.popleft())
                elif order[o] == data[0]:
                    data.popleft()
                    answer +=1
                    o += 1
                else:
                    flag = 1
                    pass
            else:
                if order[o] == sub_data[0]:
                    answer += 1
                    sub_data.popleft()
                    o += 1
                    if o > len(order)-1:
                        break
                else:
                    break
            if flag == 1:
                if order[o] == sub_data[0]:
                    answer += 1
                    sub_data.popleft()
                    o += 1
                else:
                     s_flag = 1
            if flag ==1 and s_flag == 1:
                break
            if flag ==1:
                flag = 0
        return answer

    처음에 문제에서 예제 1번을 설명을 해주는데 이해가 안 돼서 문제 이해하는 데에만 30분가량을 쏟았다.

     

    order가 [4,3,1,2,5]일 때 본 컨테이너 벨트에는 [1,2,3,4,5]가 있고 이것과 부 컨테이너 벨트 하나를 더 이용하여 order 모양으로 만드는 것이다. 처음에는 stack으로 풀어볼까 했지만 stack으로 풀면 top 인덱스를 따라다닐 변수를 두 개 더 만들어야 해서 queue로 풀었다.

     

    일단 여기에는 똑같은 두개 이상의 정수가 없다는 점과 본 컨테이너 벨트에는 크기 순서대로 있다는 것을 인지해야 한다.

     

    무한 반복을 돌면서 기사님이 싣고 싶어하는 상자의 번호와 같을 때까지 부 벨트에다가 넣어줘야 한다.  같아졌다면 본 컨테이너 벨트에서 상자를 내려주고 결값과 order 인덱스 값을 1씩 올려준다.  그리고 order값이 data의 있는 값보다 작다면 flag =1을 넣어준다. else를 넣어준 이유는 data의 값이 없어질 수 있기 때문이다.

     

     그 다음 깃발에 1이 들어가 있을 때 부 컨테이너 벨트로 넘어갈 것이다. 부 컨테이너 벨트의 입구에 있는 값과 기사님이 원하는 값이 같은지를 비교한다. 다르다면 s_flag 에다가 1을 넣어준다. 그러고 flag도 1 s_flag도 1이라면 while을 탈출한다.

     

    ※ 반례도 많을 것이라고 생각했고 문제 조건에서 order의 길이가 최대 백만이라 하여 시간 초과가 날 것 같았는데 맞았다. 문제를 풀었지만 왜 맞았는지 모르겠다 왜 맞았는지 아시는 분은 알려주시면 감사하겠습니다 (_ _)

Designed by Tistory.