Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python으로 배달 작업 목록의 유효성을 확인하는 프로그램

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