forDevLife
[백준] 18111 - 마인크래프트 본문
입력 시, 최대 높이를 받는다. 해당 높이부터 0까지 가장 짧은 시간을 구한 후, 마지막에 출력한다.
import java.io.*;
import java.util.*;
class Answer {
int time;
int height;
public Answer(int time, int height) {
this.time = time;
this.height = height;
}
}
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
int[][] arr = new int[N][M];
int m_height = 0;
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
m_height = Math.max(m_height, arr[i][j]);
}
}
int min_time = Integer.MAX_VALUE;
//시간을 최소로, 같을 경우 최대 높이로
Answer answer = new Answer(min_time, 0);
while (m_height >= 0) {
int rm = 0;
int ad = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (arr[i][j] < m_height) {
ad += m_height - arr[i][j];
}
if (arr[i][j] > m_height) {
rm += arr[i][j] - m_height;
}
}
}
int all_block = B + rm - ad;
if (all_block >= 0) {
int time = (rm * 2) + (ad);
if (time < answer.time) {
answer = new Answer(time, m_height);
}
if (time == answer.time) {
if (m_height > answer.height) {
answer = new Answer(time, m_height);
}
}
}
m_height--;
}
System.out.println(answer.time + " " + answer.height);
}
}
'알고리즘' 카테고리의 다른 글
[백준] 1654 - 랜선 자르기 (0) | 2021.06.18 |
---|---|
[백준] 2805 - 나무 자르기 (0) | 2021.06.17 |
[백준] 11866 - 요세푸스 문제 0 (0) | 2021.06.17 |
[백준] 2798 - 블랙잭 (0) | 2021.06.16 |
[백준] 2609 - 최대공약수와 최소공배수 (0) | 2021.06.16 |
Comments