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

Python으로 목표 리뷰 비율 달성에 필요한 5점 리뷰 최소 개수 계산하기

리뷰 목록 reviews와 임계값 t가 주어졌다고 가정해 보겠습니다. 각 항목 reviews[i][x, y] 형태일 때, 이는 i번째 제품이 별 5개짜리 평점을 x개, 그리고 전체 리뷰 y개를 받았다는 의미입니다. 우리가 구해야 할 것은 전체 리뷰 중 별 5개 리뷰의 비율이 최소 t% 이상이 되도록 만들기 위해 추가로 필요한 별 5개 리뷰의 최소 개수입니다.

예를 들어 입력이 reviews = [[3, 4], [1, 2], [4, 6]], threshold = 78이라면 출력은 7이 됩니다. 현재까지의 별 5개 리뷰는 총 8개이고 전체 리뷰는 12개이므로, 78%의 별 5개 리뷰 비율을 달성하려면 별 5개 리뷰를 7개 더 받아야 하기 때문입니다.

문제 해결 접근 방법

이 문제는 다음 단계를 따라 해결할 수 있습니다.

  • 누적 변수 a = 0, b = 0으로 초기화합니다. (a는 별 5개 리뷰 수의 합, b는 전체 리뷰 수의 합)

  • reviews의 각 항목에서 별 5개 리뷰 수 c와 전체 리뷰 수 d를 꺼내며 다음을 반복합니다.

    • a := a + c

    • b := b + d

  • 만약 a * 100 >= t * b라면 이미 조건을 충족하므로 0을 반환합니다.

  • 그렇지 않다면 부족한 분량인 delta = t * b - 100 * a를 계산합니다.

  • (delta + (99 - t)) // (100 - t)의 결과(내림 나눗셈)를 반환합니다.

핵심 공식의 원리

추가 리뷰 n개를 더했을 때 비율 조건은 (a + n) / (b + n) >= t / 100 입니다. 이 식을 정리하면 n >= (t * b - 100 * a) / (100 - t)가 되고, 여기서 올림 나눗셈 효과를 얻기 위해 분자에 (99 - t)를 더한 뒤 내림 나눗셈(//)을 적용하는 것입니다. 이는 정수 연산만으로 올림 처리를 깔끔하게 수행하는 대표적인 기법입니다.

예제 코드

아래 구현을 통해 더 잘 이해해 보겠습니다.

def solve(reviews, t):
   a = 0
   b = 0
   for c, d in reviews:
      a += c
      b += d
   if a * 100 >= t * b:
      return 0
   delta = t * b - 100 * a
   return (delta + (99 - t)) // (100 - t)

reviews = [
   [3, 4],
   [1, 2],
   [4, 6]
]
t = 78
print(solve(reviews, t))

입력

[[3, 4], [1, 2], [4, 6] ], 78

출력

7