orders라는 문자열 리스트가 있다고 가정해 봅시다. 리스트의 각 요소는 "P" 또는 "D"로 시작하는데, "P"는 픽업(pick up)을, "D"는 배달(delivery)을 의미합니다. 문자 뒤에는 주문 번호가 붙습니다. 예를 들어 "P6"은 6번 주문을 픽업했다는 뜻입니다.
유효성 판단 규칙
다음 세 가지 규칙에 따라 orders 리스트가 유효한지 확인해야 합니다.
- 픽업하기 전에 해당 주문을 배달할 수 없습니다.
- 모든 픽업된 주문은 반드시 배달까지 완료되어야 합니다.
- 이미 픽업과 배달이 모두 완료된 주문은 다시 픽업하거나 배달할 수 없습니다.
예를 들어 입력이 orders = ["P1", "D1", "P2", "P3", "D3", "D2"]라면 결과는 True입니다. 첫 번째 주문은 픽업 직후 배달되었고, 두 번째와 세 번째 주문도 연달아 픽업된 후 마지막에 모두 배달되었기 때문입니다.
해결 접근 방법
이 문제는 다음 단계를 따라 해결할 수 있습니다.
- 상태를 저장할 빈 딕셔너리 a를 생성합니다.
- orders에 중복된 항목이 존재하면 False를 반환합니다. 같은 작업이 두 번 나타나면 규칙 위반이기 때문입니다.
- orders의 각 요소 i에 대해 다음을 수행합니다.
- i가 "P"로 시작하면: a[픽업 주문 번호] = 1로 설정하여 픽업 상태를 기록합니다.
- i가 "D"로 시작하면:
- 해당 주문 번호가 a에 없으면, 아직 픽업되지 않은 주문을 배달하려는 것이므로 False를 반환합니다.
- 그렇지 않으면 a[배달 주문 번호] 값을 1 감소시켜 배달 완료를 표시합니다.
- 마지막으로 a에 있는 모든 값의 합이 0이면 True를, 그렇지 않으면 False를 반환합니다. 합이 0이 아니라면 픽업만 되고 배달되지 않은 주문이 남아 있다는 의미입니다.
예제 코드
다음 구현을 통해 더 잘 이해해 보겠습니다.
def solve(orders):
a = {}
if len(set(orders)) != len(orders):
return False
for i in orders:
if i[0] == "P":
a[i[1:]] = 1
elif i[0] == "D":
if i[1:] not in a:
return False
else:
a[i[1:]] -= 1
return sum(a.values()) == 0
orders = ["P1", "D1", "P2", "P3", "D3", "D2"]
print(solve(orders))입력
["P1", "D1", "P2", "P3", "D3", "D2"]
출력
True