리뷰 목록 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 + cb := 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