정말 어려운 문제였다. 오랬동안 코테를 풀지 않아서 감이 떨어졌을 수도 있지만 그 점을 감안하더라도 체감상 매우 어려웠다.
코드를 설명하자면, 입력을 배열로 받고 최대 높이인 256까지 for loop을 돌면서 연산을 수행하는데,
이때 숫자를 i라고 하자. 그리고 입력받은 배열을 다시 loop를 돌린다. 이때 숫자는 n이라고 가정한다.
만약 n > i 라면 인벤토리에 n - i만큼의 값을 추가하고 걸린시간을 의미하는 sum 변수에 2초 * n에서 i를 뺀 값 만큼을 더한다.
n < i 라면 인벤토리에서 블럭을 i - n만큼 빼서 걸린시간을 1초 * i - n값만큼 더한다.
입력받은 배열의 loop가 끝나면 인벤토리에 0 이상의 블럭이 남아있고 걸린시간이 최소거나 최소이고 최대 블럭이 더 클 때 최대블럭값과 걸린시간에 현재 loop의 값을 추가한다. 이 과정을 반복하게 된다.
import java.io.*;
import java.util.*;
import java.util.stream.Collectors;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String[] input = br.readLine().split(" ");
int y = Integer.parseInt(input[0]);
int x = Integer.parseInt(input[1]);
int inven = Integer.parseInt(input[2]);
Integer[] arr = new Integer[y * x];
int count = 0;
for (int i = 0; i < y; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
while (st.hasMoreTokens()) {
int n = Integer.parseInt(st.nextToken());
arr[count++] = n;
}
}
int maxAvg = 0;
int minTime = Integer.MAX_VALUE;
for (int i = 0; i < 257; i++) {
int invenTemp = inven;
int sum = 0;
for (Integer n : arr) {
if (n > i) {
invenTemp += n - i;
sum += (n - i) * 2;
} else if (n < i) {
invenTemp -= i - n;
sum += i - n;
}
}
if (invenTemp >= 0 && (sum < minTime || (sum == minTime && i > maxAvg))) {
maxAvg = i;
minTime = sum;
}
}
bw.write(minTime + " " + maxAvg);
br.close();
bw.close();
}
}
'코테' 카테고리의 다른 글
백준 5179번 : 우승자는 누구? (0) | 2024.04.21 |
---|---|
[이코테] 탐색 알고리즘 DFS/BFS (0) | 2024.04.09 |
[이코테] 꼭 필요한 자료구조 기초 (0) | 2024.04.05 |
백준 1195번 : 킥다운 (1) | 2024.01.09 |
백준 1700번 : 멀티탭 스케쥴링 (0) | 2024.01.06 |