백준 10800 - 컬러볼 (파이썬)
글 작성자: pental
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])
'Programming > 백준' 카테고리의 다른 글
백준 31962 - 등교 (파이썬) (0) | 2025.03.26 |
---|---|
백준 25377 - 빵 (파이썬) (0) | 2025.03.25 |
백준 21756 - 지우개 (파이썬) (0) | 2025.03.23 |
백준 19941 - 햄버거 분배 (파이썬) (0) | 2025.03.22 |
백준 17608 - 막대기 (파이썬) (0) | 2025.03.21 |
댓글
이 글 공유하기
다른 글
-
백준 31962 - 등교 (파이썬)
백준 31962 - 등교 (파이썬)
2025.03.26 -
백준 25377 - 빵 (파이썬)
백준 25377 - 빵 (파이썬)
2025.03.25 -
백준 21756 - 지우개 (파이썬)
백준 21756 - 지우개 (파이썬)
2025.03.23 -
백준 19941 - 햄버거 분배 (파이썬)
백준 19941 - 햄버거 분배 (파이썬)
2025.03.22