-
프로그래머스 택배상자(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의 길이가 최대 백만이라 하여 시간 초과가 날 것 같았는데 맞았다. 문제를 풀었지만 왜 맞았는지 모르겠다 왜 맞았는지 아시는 분은 알려주시면 감사하겠습니다 (_ _)
'Algorithm > 프로그래머스_생각정리' 카테고리의 다른 글
프로그래머스_광물캐기_level2(python) (0) 2023.03.26 프로그래머스_두 큐 합 같게 만들기_level2(python) (0) 2023.03.23 프로그래머스_level 2_리코쳇 로봇(python) (0) 2023.03.19 프로그래머스_주차 요금 계산(python) (0) 2022.12.08 프로그래머스 우박수열_정적분(python) (0) 2022.12.06