반응형
처음 로직은 맞았지만 크기가 2000인줄 착각해서 runtime 에러를 해결하지 못했다.
문제는 크기별로 정렬한뒤 누적사이즈 - 누적컬러사이즈[현재색갈] 을 빼주면 된다.
하지만 문제인것이 같은 색깔의 같은 사이즈가 나온다면 문제가없지만
다른 색깔의 같은 사이즈가나오면 같은 크기는 제거하지 못한다 그것은 pivot을 만들어서 다른색갈이 나올때마다 크기별 사이즈들을 저장해서 해결했다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class 컬러볼 {
static int N;
static class Ball implements Comparable<Ball> {
int color;
int size;
int num;
public Ball(int color, int size, int num) {
this.color = color;
this.size = size;
this.num = num;
}
@Override
public int compareTo(Ball o) {
if (size > o.size) {
return 1;
} else if (size == o.size) {
return color - o.color;
} else {
return -1;
}
}
}
static long colorCnt[] = new long[200001];
static long allCnt = 0;
static long ans[] = new long[200001];
static int sizeCnt[] = new int[200001];
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str[];
N = Integer.parseInt(br.readLine());
Ball ball[] = new Ball[N];
for (int i = 0; i < N; i++) {
str = br.readLine().split(" ");
ball[i] = new Ball(Integer.parseInt(str[0]), Integer.parseInt(str[1]), i);
// int c = (int) (Math.random() * 2000 +1);
// int size = (int) (Math.random()* 2000 +1);
// ball[i] = new Ball(c, size, i);
}
Arrays.sort(ball);
// 이코드에서는 같은 size를 잡아먹는 경우가 있다.
// 고치기 위해서는 같은 크기일경우 그사이즈만큼은 더빼주는걸로하자.
int curSize = -1;
int sizeNum = 0;
for (int i = 0; i < N; i++) {
if (curSize == ball[i].size) {
ans[ball[i].num] -= curSize * sizeNum;
ans[ball[i].num] += sizeCnt[ball[i].color] * curSize;
sizeNum++;
} else {
Arrays.fill(sizeCnt, 0);
curSize = ball[i].size;
sizeNum = 1;
}
ans[ball[i].num] += allCnt - colorCnt[ball[i].color];
allCnt += ball[i].size;
colorCnt[ball[i].color] += ball[i].size;
sizeCnt[ball[i].color]++;
}
StringBuffer sb = new StringBuffer();
for (int i = 0; i < N; i++) {
sb.append(ans[i]).append('\n');
}
System.out.print(sb.toString());
}
}
반응형
'ProgramSoliving' 카테고리의 다른 글
백준 : 8983 사냥꾼 (0) | 2020.05.24 |
---|---|
백준 : 관중석(10166) JAVA (0) | 2020.05.24 |
백준 : 17090 미로 탈출하기 (0) | 2020.05.21 |
SW아카데미 : 숫자게임 (0) | 2020.05.21 |
백준 : 13459 (0) | 2020.05.18 |