Programming/백준

백준 10800 - 컬러볼 (파이썬)

pental 2025. 3. 24. 10:54

https://www.acmicpc.net/problem/10800

풀이

각 공은 색 c와 크기 s를 가짐, 공을 하나 선택했을 때, 자신보다 크기가 작은 모든 공들 중 색이 다른 공들의 크기 합을 구해야 한다.

최대 크기인 2000을 기준으로 balls[크기] = [(색, 인덱스)] 형태로 공을 저장한다.

N = int(input())
balls = [[] for _ in range(2001)]

입력받은 공의 색(c)과 크기(s)를 balls 배열에 저장한다. (같은 크기의 공들을 묶어서 저장)

for i in range(N):
    c, s = map(int, input().split())
    balls[s].append((c, i))

누적합 계산을 진행한다. 단 작은 크기부터 순회한다.

for i in range(1, 2001):
    for c, id in balls[i]:
        if c not in count:
            count[c] = 0
        answer[id] = total - count[c]

현재 크기 i의 공들을 확인하며, 전체 누적 크기(total) 에서 같은 색 공들의 누적 크기(count[c]) 를 빼준다.

즉, 같은 색깔 공은 제외하고 자신보다 작은 크기의 공의 크기합을 구하는것이다.

현재 크기의 공들을 누적합에 추가한다.

total += i * len(balls[i])
for c, _ in balls[i]:
    count[c] += i

크기 i인 공이 n개라면 total += i * n 을 통해서 각 색깔별로도 누적합을 관리한다.

코드

# 백준 10800 - 컬러볼
# 분류 : 누적합

import sys
input = sys.stdin.readline

N = int(input())

balls = [[] for _ in range(2001)]

for i in range(N) :
    c, s = map(int, input().split())
    balls[s].append((c, i))

answer = [0] * N
total = 0
count = {}
for i in range(1, 2001) :
    for c, id in balls[i] :
        if c not in count :
            count[c] = 0
        answer[id] = total - count[c]
    
    total += i * len(balls[i])

    for c, _ in balls[i] :
        count[c] += i

for i in range(N) :
    print(answer[i])