Algorithm/백준 알고리즘

백준_18111 마인크래프트 (자바) / 구현

미스터로즈 2021. 8. 26. 19:38

시간&메모리 제한

 

문제

 

입력&출력

 

문제 풀이

package com.Back;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Back_18111 {

	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[][] map = new int[N][M];
		int min = Integer.MAX_VALUE;
		int max = 0;
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < M; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
				min = Math.min(min, map[i][j]);
				max = Math.max(max, map[i][j]);
			}
		}

		int ansS = Integer.MAX_VALUE;
		int ansH = -1;
		for (int f = min; f <= max; f++) {
			int time = 0;
			int block = B;

			for (int i = 0; i < N; i++) {
				for (int j = 0; j < M; j++) {
					int dif = map[i][j] - f;

					if (dif > 0) {
						time += Math.abs(dif) * 2;
						block += Math.abs(dif);
					} else if (dif < 0) {
						time += Math.abs(dif);
						block -= Math.abs(dif);
					}

				}
			}
			if (block < 0)
				continue;
			if (ansS >= time) {
				ansS = time;
				ansH = f;
			}
		}

		System.out.println(ansS + " " + ansH);
	}
}
※ 내 생각

이 문제의 경우는 층의 높이 최솟값부터 최댓값을 구한 후에 전부 탐색을 해주는 구현문제입니다.
값을 받아 오는 동시에 최솟값과 최댓값을 구했습니다.
또한 그 사이의 내가 만들고자 하는 층을 for문을 통해서 만들었으며, 그 높이 만큼 되기 위해서 이중 for문을 돌려서 모두 확인했습니다.