문제링크
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV139KOaABgCFAYh
역시 D3 인데 간단합니다. 제일 높은 것을 찾고, 제일 낮은 것을 찾은 뒤에 더하고 빼주면 됩니다.
public static void flatten(int dump, int[] boxes) {
int index_big = getBigIndex(boxes);
int index_small = getSmallIndex(boxes);
int gap = boxes[index_big] - boxes[index_small];
if (dump == 0) {
System.out.println(gap);
return;
}
if (gap == 1 || gap == 0) {
System.out.println(gap);
return;
}
boxes[index_big]--;
boxes[index_small]++;
flatten(dump - 1, boxes);
}
가장 큰 곳과 작은 곳에 1더하고 1 빼주면 됩니다. 주의할 점은 주어진 덤프횟수가 끝나기 전에 평탄화가 끝날 수도 있습니다. 이 때를 위해 차이가 1이나 0일 때 출력하도록 했습니다.
import java.util.*;
import java.io.*;
class Solution
{
int res;
public static void main(String args[]) throws Exception
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int dump;
int ans = 0;
int[] boxes = new int[100];
for(int test_case = 1; test_case <= 10; test_case++)
{
dump = Integer.parseInt(br.readLine());
//System.out.println(dump);
st = new StringTokenizer(br.readLine());
// input
for (int i = 0; i < 100; i++) {
boxes[i] = Integer.parseInt(st.nextToken());
}
System.out.print("#" + test_case +" ");
flatten(dump, boxes);
}
}
public static void flatten(int dump, int[] boxes) {
int index_big = getBigIndex(boxes);
int index_small = getSmallIndex(boxes);
int gap = boxes[index_big] - boxes[index_small];
if (dump == 0) {
System.out.println(gap);
return;
}
if (gap == 1 || gap == 0) {
System.out.println(gap);
return;
}
boxes[index_big]--;
boxes[index_small]++;
flatten(dump - 1, boxes);
}
public static int getBigIndex(int[] boxes) {
int big = Integer.MIN_VALUE;
int index = -1;
for (int i = 0 ; i < 100; i++) {
if (boxes[i] > big) {
big = boxes[i];
index = i;
}
}
return index;
}
public static int getSmallIndex(int[] boxes) {
int small = Integer.MAX_VALUE;
int index = -1;
for (int i = 0 ; i < 100; i++) {
if (boxes[i] < small) {
small = boxes[i];
index = i;
}
}
return index;
}
}
계속 메모리 오류나길래 버퍼리더의 문제인 줄 알았지만, 결국 내 잘못이었다.