문제 링크 : 백준 10800번
n이 최대 200,000이기 때문에 최적화를 해줘야 한다. 나는 정렬을 이용해 풀었다.
인덱스, 색, 사이즈를 가지고 있는 구조체를 통해 info 슬라이스에 정보를 담았고 sumColor 슬라이스에는 각 색깔 별로 사용한 크기 정보를 갱신해주었다.
package main
import (
"bufio"
"fmt"
"os"
"sort"
)
type node struct {
index int
color int
size int
}
var (
r = bufio.NewReader(os.Stdin)
w = bufio.NewWriter(os.Stdout)
n int
totalnum int
)
func main() {
defer w.Flush()
fmt.Fscan(r, &n)
info := make([]node, n)
sumColor := make([]int, n+1)
ans := make([]int, n)
for i := 0; i < n; i++ {
info[i].index = i
fmt.Fscan(r, &info[i].color, &info[i].size)
}
// 공 크기가 큰 순으로 정렬
sort.Slice(info, func(i, j int) bool {
return info[i].size < info[j].size
})
j := 0
for i := 0; i < n; i++ {
for ; info[i].size > info[j].size; j++ { // 전꺼와 크기가 같으면 넘어감
// 자기보다 작은 공들의 크기 합 저장
totalnum += info[j].size
sumColor[info[j].color] += info[j].size
}
// 같은 색상 제거
ans[info[i].index] = totalnum - sumColor[info[i].color]
}
for _, val := range ans {
fmt.Fprintln(w, val)
}
}