[python] BOJ 10800 컬러볼
문제 설명
플레이어는 각각 특정한 색과 크기를 가진 공 하나를 조종하여 게임에 참여하는데 다른 공을 잡아도 본인의 공의 색과 크기는 변하지 않는다. 플레이어가 가지고 있는 공보다 크기가 작고 색깔이 다른 공만 잡을 수 있다. 각 플레이어 별로 주어진 공으로 잡을 수 있는 모든 공들의 크기의 합을 출력하는 것이 문제의 목표이다. 풀이 과정을 대략적인 그림으로 보면 아래와 같다.
코드 설명
import sys
n = int(input())
INF = 200000
balls = []
for i in range(n):
color, size = map(int, sys.stdin.readline().split())
balls.append((size, color, i))
#공의 size, color, input 순서(player)에 대한 정보를 넣는다
balls.sort()
color_count = [0] * (INF + 1)
total = 0
j = 0
ans = [0] * (n + 1)
for i in range(n):
while balls[j][0] < balls[i][0]: # 문제의 제한조건에서 player가 잡을 수 있는 전제 조건 중 하나인
# 나의 공보다 사이즈가 작아야 잡을 수 있다의 조건을 충족시켜주기 위한 부분
color_count[balls[j][1]] += balls[j][0]
total += balls[j][0]
j += 1
ans[balls[i][2]] = total - color_count[balls[i][1]] # 누적합 계산
# 나의 공보다 작은 공들의 크기 총합에서 나와 색깔이 같은
# 공들의 합을 빼준다
# 문제의 제한 조건 중 하나인 색깔이 다른 공만 잡을 수 있다
# 여기까지 완료해 주면 문제의 두가지 제한조건이 완성
for i in range(n):
print(ans[i])
주의 할 점
"같은 색은 잡을 수 없다 or 작은 것만 잡을 수 있다" 라고 바꿔보면 문제 난이도가 수직 하강하는데 두가지를 동시에 만족 해야 하는 문제로 간단한 덧셈 뺄셈 같아 보이지만 겹치지 않게 원하는 값을 뽑을 수 있게 조건을 걸어주는 것이 중요하다. 또한 문제에서 들어 올 수 있는 공의 갯수의 범위(1 ≤ N ≤ 200,000)가 매우 크기 때문에 이 부분을 줄일 수 있는 방법을 생각해야 한다.
문제 풀러 가기
https://www.acmicpc.net/problem/10800
Author And Source
이 문제에 관하여([python] BOJ 10800 컬러볼), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jinlee/python-BOJ-10800-컬러볼저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)