https://www.acmicpc.net/problem/18111
📝문제
📝풀이
단순 완전 탐색 + 구현 문제이다
주어진 map 좌표에서 높이의 범위를 받은다음
범위 내 높이를 기준 h 에서 평평해지는 조건을 전부 찾아
time과 inventory 조건을 만족할 때 마다 갱신을 시켜주면 된다.
import static java.util.Arrays.*;
import java.io.*;
public class Main {
static int[][] map;
static int h,w,b;
static int fromHeight=Integer.MAX_VALUE, toHeight=0;
static int minTime=Integer.MAX_VALUE,maxHeight;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[] input = stream(br.readLine().split(" "))
.mapToInt(Integer::parseInt).toArray();
h = input[0];w=input[1];b=input[2];
map = new int[h][w];
for(int y=0;y<h;y++){
map[y] = stream(br.readLine().split(" "))
.mapToInt(Integer::parseInt).toArray();
fromHeight = Math.min(stream(map[y]).min().getAsInt(), fromHeight);
toHeight = Math.max(stream(map[y]).max().getAsInt(), toHeight); // 시간 초과 방지를 위해 블록 높이 range 설정
} // end input
for(int height = fromHeight; height<= toHeight; height++){
int time=0;
int inventory = b;
for(int y=0;y<h;y++){
for(int x=0;x<w;x++){ // 전체 좌표 탐색
if(time>minTime) // 최소 시간보다 높으면 continue
continue;
int diff = map[y][x]-height; // 블럭 높이 차이
if(diff>0){
time+=diff*2;
inventory += diff;
}else if(diff<0){
time-=diff;
inventory +=diff;
}
}
}
if(inventory<0) // 채울 블럭이 없으면 pass
continue;
if(time<=minTime){ // 높이가 커지는 순으로 탐색하므로 time 이 같다면 갱신가능
maxHeight = height;
minTime = time;
}
}
System.out.println(minTime+" "+maxHeight);
}
}
'알고리즘,PS > 백준' 카테고리의 다른 글
[BOJ] 백준 [1406] 에디터 JAVA (0) | 2022.04.26 |
---|---|
[BOJ] 백준 [2504] 괄호의 값JAVA (0) | 2022.04.21 |
[BOJ] 백준 [1107] 리모컨 JAVA (0) | 2022.04.15 |
[BOJ] 백준 [14500] 테트로미노 JAVA (0) | 2022.04.14 |
[BOJ] 백준 [1800] 인터넷 설치 JAVA (0) | 2022.04.13 |