Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 모든 공을 각 상자로 이동하는 최소 작업 수를 찾는 프로그램

<시간/>

상자라는 이진 문자열이 있다고 가정합니다. 여기서 상자[i]는 '0'은 i번째 상자가 비어 있음을 나타내고 '1'은 하나의 공이 포함되어 있음을 나타냅니다. 이제 한 번의 작업으로 상자에서 인접한 상자로 공 하나를 이동할 수 있습니다. 그렇게 하고 나면 어떤 상자에는 하나 이상의 공이 있을 수 있습니다. 크기가 n인 배열 답을 찾아야 합니다. 여기서 answer[i]는 모든 공을 i번째 상자로 이동하는 데 필요한 최소 작업 수입니다.

따라서 입력이 상자 ="1101"과 같으면 출력은 [4, 3, 4, 5]

가 됩니다.
  • 첫 번째 상자에 모든 공을 넣으려면 상자 2에서 한 번의 작업으로, 마지막 볼에서 세 번의 작업으로 총 4번의 작업을 가져와야 합니다.

  • 모든 공을 두 번째 상자에 넣으려면 상자 1에서 한 번의 작업으로, 마지막 볼에서 두 번의 작업으로 가져와서 총 3번의 작업을 수행해야 합니다.

  • 세 번째 상자에 모든 공을 넣으려면 상자 2에서 각각 한 번의 작업으로 마지막 작업을 가져와야 하고 상자 1에서 두 번의 작업으로 총 4개의 작업을 가져와야 합니다.

  • 마지막 상자에 모든 공을 넣으려면 상자 1에서 3번의 작업을, box 2에서 2번의 작업을 가져와서 총 5번의 작업을 수행해야 합니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 왼쪽 :=0, 오른쪽 :=0, 거리 :=0

  • 범위 0에서 상자 크기 - 1에 있는 i의 경우 수행

    • box[i]가 "1"과 같으면

      • dist :=dist + i

      • i가 0과 같으면

        • 왼쪽 :=왼쪽 + 1

      • 그렇지 않으면

        • 오른쪽 :=오른쪽 + 1

  • arr :=목록이고 처음에 dist를 그 안에 넣습니다.

  • 범위 1에서 상자 크기 - 1에 있는 i의 경우 수행

    • 삽입 arr[i-1] + 왼쪽 - 오른쪽 끝에 arr

    • box[i]가 "1"과 같으면

      • 왼쪽 :=왼쪽 + 1

      • 오른쪽 :=오른쪽 - 1

  • 반환 arr

예시

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

def solve(boxes):
   left = 0
   right = 0

   dist = 0
   for i in range(len(boxes)):
      if boxes[i] == "1":
         dist += i
         if i == 0:
            left += 1
         else:
            right += 1
   arr = [dist]
   for i in range(1, len(boxes)):
      arr.append(arr[i-1] + left - right)
      if boxes[i] == "1":
         left += 1
         right -= 1
   return arr

boxes = "1101"
print(solve(boxes))

입력

"1101"

출력

[4, 3, 4, 5]