1 분 소요

1. 문제

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

  • 정렬 문제
// 문제
지훈이가 최근에 즐기는 컴퓨터 게임이 있다. 
 게임은 여러 플레이어가 참여하며, 
 플레이어는 특정한 색과 크기를 가진 자기  하나를 조종하여 게임에 참여한다. 
 플레이어의 목표는 자기 공보다 크기가 작고 
색이 다른 공을 사로잡아  공의 크기만큼의 점수를 얻는 것이다. 
그리고 다른 공을 사로잡은 이후에도 본인의 공의 색과 크기는 변하지 않는다. 
다음 예제는  개의 공이 있다. 편의상 색은 숫자로 표현한다.

 번호	 	 크기
   1	   1	  10
   2	   3	  15
   3	   1	   3
   4	   4	   8
 경우, 2 공은 다른 모든 공을 사로잡을  있다. 
반면, 1 공은 크기가   2 공과 색이 같은 3 공은 잡을  없으며, 
단지 4 공만 잡을  있다. 

공들의 색과 크기가 주어졌을 , 
 플레이어가 사로잡을  있는 
모든 공들의 크기의 합을 출력하는 프로그램을 작성하시오. 

// 입력
 줄에는 공의 개수를 나타내는 자연수 N이 주어진다(1  N  200,000). 
다음 N개의   i번째 줄에는 i번째 공의 색을 나타내는 자연수 Ci와 
 크기를 나타내는 자연수 Si가 주어진다(1  Ci  N, 1  Si  2,000). 
서로 같은 크기 혹은 같은 색의 공들이 있을  있다.

// 출력
N개의 줄을 출력한다. 
N개의   i번째 줄에는 i번째 공을 가진 플레이어가 잡을  있는 
모든 공들의 크기 합을 출력한다.

// 예제 입력 1 
4
1 10
3 15
1 3
4 8

// 예제 출력 1 
8
21
0
3

// 예제 입력 2 
3
2 3
2 5
2 4

// 예제 출력 2 
0
0
0


2. 핵심 아이디어


3. Python 문제풀이

from collections import defaultdict
import sys
input = sys.stdin.readline

if __name__ == "__main__" :
  n = int(input())
  ball = []
  for i in range(n) :
    c, s = map(int, input().split())
    ball.append([c, s, i])

  ball.sort(key = lambda x : x[1])

  result = defaultdict(int)
  size = defaultdict(int)

  total = 0
  i, j = 0, 0
  
  for i in range(n) :
    while ball[j][1] < ball[i][1] :
      total += ball[j][1]
      size[ball[j][0]] += ball[j][1]
      j += 1
    result[ball[i][2]] = total - size[ball[i][0]]

  for i in range(n) :
    print(result[i])


4. Java 문제풀이


댓글남기기