import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main{
private static boolean [][] isRed; // 이동이 가능하면 false or true
private static final int[][] DIRECTIONS = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
private static final int ROW = 0;
private static final int COL = 1;
private static final String SPACE
= " ";
private static class Point{ int row;
int col;
public Point(int row,
int col
) { this.row = row;
this.col = col;
}
}
int M
= Integer.
parseInt(st.
nextToken()); int N
= Integer.
parseInt(st.
nextToken()); int V
= Integer.
parseInt(st.
nextToken());
int[][] map = new int[M + 1][N + 1];
for(int i = 1; i < M + 1; i++) {
for(int j = 1; j < N + 1; j++) {
map
[i
][j
] = Integer.
parseInt(st.
nextToken()); }
}
ArrayList
<Point
>[] volca
= new ArrayList[201]; for(int i = 0; i < 201; i++){
volca[i] = new ArrayList<>();
}
isRed = new boolean[M + 1][N + 1];
for(int i = 0; i < V; i++) {
int row
= Integer.
parseInt(st.
nextToken()); int col
= Integer.
parseInt(st.
nextToken()); int timer
= Integer.
parseInt(st.
nextToken());
volca
[timer
].
add(new Point(row, col
)); // 인접 리스트에 화산 폭발 시간과 그 화산의 위치를 저장합니다. isRed[row][col] = true; // 화산이 존재하는 지역은 이미 이동 불가
}
System.
out.
println(bfs
(M, N, V, map, volca, s
)); }
private static StringBuilder bfs
(int n,
int m,
int v,
int[][] arr, ArrayList
<Point
>[] hole,
Point start
) { StringBuilder sb = new StringBuilder();
int[][] isVisited = new int[n + 1][m + 1];
int max = arr[start.row][start.col], minTime = 0;
Queue<Point> q = new LinkedList<>();
q.
offer(new Point(start.
row, start.
col)); isVisited[start.row][start.col] = 1; // 현 위치의 값 및 방문 여부를 저장합니다. 실제 시간: isVisited[row][col] - 1
while(!q.isEmpty()) {
Point current
= q.
poll(); // 현재 시간에 맞춰 메소드를 호출하여 화산 쇄설류를 덮어줍니다.
if(isVisited[current.row][current.col] < 201) covering(n, m, v, hole, isVisited[current.row][current.col]);
for(final int[] DIRECTION: DIRECTIONS) {
int nextRow = current.row + DIRECTION[ROW];
int nextCol = current.col + DIRECTION[COL];
if(nextRow < 1 || nextRow > n || nextCol < 1 || nextCol > m) continue;
if(isVisited[nextRow][nextCol] != 0 || isRed[nextRow][nextCol]) continue; // 이미 방문했거나 쇄설류가 덮친 경우
isVisited[nextRow][nextCol] = isVisited[current.row][current.col] + 1;
if(arr[nextRow][nextCol] > max) max = arr[nextRow][nextCol]; // 이동할 수 있는 지역 중 최대 높이
q.
offer(new Point(nextRow, nextCol
)); }
}
minTime = getMinTime(n, m, arr, isVisited, max);
sb.
append(max
).
append(SPACE
).
append(minTime
== Integer.
MAX_VALUE ? 0 : minTime
); return sb;
}
private static int getMinTime(int n, int m, int[][] arr, int[][] visit, int maxPos) {
for(int i = 1; i < n + 1; i++) {
for(int j = 1; j < m + 1; j++) {
if(arr[i][j] == maxPos) { // 최대 높이 값을 갖는 행과 열의 값을 통해 최소 시간을 찾습니다.
if(visit[i][j] - 1 < min) min = visit[i][j] - 1;
}
}
}
return min;
}
private static boolean isCovered(int holeRow, int holeCol, int row, int col, int time) {
return time
>= Math.
abs(holeRow
- row
) + Math.
abs(holeCol
- col
) ? true: false; }
private static void covering(int n, int m, int v, ArrayList<Point>[] hole, int timer) {
for(int t = 0; t < timer; t++) { // timer는 현재까지 경과된 시간입니다. 즉 isVisited의 배열값입니다.
for(Point pair
: hole
[t
]) { // t시간에 폭발한 화산이 있다면 for(int row = 1; row < n + 1; row++) {
for(int col = 1; col < m + 1; col++) {
if(isRed[row][col]) continue; // 이미 화산이 덮은 곳은 무시합니다.
// 현재까지 경과시간(timer, isVisited) - 화산이 폭발한 시간(t) 값으로 문제의 조건대로 계산합니다.
// 현재까지 경과시간(timer, isVisited) - 화산이 폭발한 시간(t) : 문제 설명에서 주어진 'δ' 라고 생각했습니다.
isRed[row][col] = isCovered(row, col, pair.row, pair.col, timer - t);
}
}
}
}
}
}
aW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CmltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwppbXBvcnQgamF2YS51dGlsLlF1ZXVlOwppbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKCnB1YmxpYyBjbGFzcyBNYWluewoJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBbXVtdIGlzUmVkOyAgICAgICAgLy8g7J2064+Z7J20IOqwgOuKpe2VmOuptCBmYWxzZSBvciB0cnVlCglwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXVtdIERJUkVDVElPTlMgPSB7ezEsIDB9LCB7MCwgMX0sIHstMSwgMH0sIHswLCAtMX19OwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJPVyA9IDA7Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MID0gMTsKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRSA9ICIgIjsKCQoJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUG9pbnR7CgkJaW50IHJvdzsKCQlpbnQgY29sOwoJCQoJCXB1YmxpYyBQb2ludChpbnQgcm93LCBpbnQgY29sKSB7CgkJCXRoaXMucm93ID0gcm93OwoJCQl0aGlzLmNvbCA9IGNvbDsKCQl9Cgl9CgkKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb257CgkJQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKFN5c3RlbS5pbikpOwoJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYnIucmVhZExpbmUoKSk7CgkJaW50IE0gPSBJbnRlZ2VyLnBhcnNlSW50KHN0Lm5leHRUb2tlbigpKTsKCQlpbnQgTiA9IEludGVnZXIucGFyc2VJbnQoc3QubmV4dFRva2VuKCkpOwoJCWludCBWID0gSW50ZWdlci5wYXJzZUludChzdC5uZXh0VG9rZW4oKSk7CgkJCgkJc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGJyLnJlYWRMaW5lKCkpOwoJCVBvaW50IHMgPSBuZXcgUG9pbnQoSW50ZWdlci5wYXJzZUludChzdC5uZXh0VG9rZW4oKSksIEludGVnZXIucGFyc2VJbnQoc3QubmV4dFRva2VuKCkpKTsKCQkKCQlpbnRbXVtdIG1hcCA9IG5ldyBpbnRbTSArIDFdW04gKyAxXTsKCQkKCQlmb3IoaW50IGkgPSAxOyBpIDwgTSArIDE7IGkrKykgewoJCQlzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYnIucmVhZExpbmUoKSk7CgkJCWZvcihpbnQgaiA9IDE7IGogPCBOICsgMTsgaisrKSB7CgkJCQltYXBbaV1bal0gPSBJbnRlZ2VyLnBhcnNlSW50KHN0Lm5leHRUb2tlbigpKTsKCQkJfQoJCX0KCQkKCQlBcnJheUxpc3Q8UG9pbnQ+W10gdm9sY2EgPSBuZXcgQXJyYXlMaXN0WzIwMV07CgkJZm9yKGludCBpID0gMDsgaSA8IDIwMTsgaSsrKXsKCQkJdm9sY2FbaV0gPSBuZXcgQXJyYXlMaXN0PD4oKTsKCQl9CgkJCgkJaXNSZWQgPSBuZXcgYm9vbGVhbltNICsgMV1bTiArIDFdOwoJCWZvcihpbnQgaSA9IDA7IGkgPCBWOyBpKyspIHsKCQkJc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGJyLnJlYWRMaW5lKCkpOwoJCQlpbnQgcm93ID0gSW50ZWdlci5wYXJzZUludChzdC5uZXh0VG9rZW4oKSk7CgkJCWludCBjb2wgPSBJbnRlZ2VyLnBhcnNlSW50KHN0Lm5leHRUb2tlbigpKTsKCQkJaW50IHRpbWVyID0gSW50ZWdlci5wYXJzZUludChzdC5uZXh0VG9rZW4oKSk7CgkJCQoJCQl2b2xjYVt0aW1lcl0uYWRkKG5ldyBQb2ludChyb3csIGNvbCkpOyAgICAvLyDsnbjsoJEg66as7Iqk7Yq47JeQIO2ZlOyCsCDtj63rsJwg7Iuc6rCE6rO8IOq3uCDtmZTsgrDsnZgg7JyE7LmY66W8IOyggOyepe2VqeuLiOuLpC4KCQkJaXNSZWRbcm93XVtjb2xdID0gdHJ1ZTsgICAgICAgICAgICAgICAgLy8g7ZmU7IKw7J20IOyhtOyerO2VmOuKlCDsp4Dsl63snYAg7J2066+4IOydtOuPmSDrtojqsIAKCQl9CgkJCgkJU3lzdGVtLm91dC5wcmludGxuKGJmcyhNLCBOLCBWLCBtYXAsIHZvbGNhLCBzKSk7Cgl9CgkKCXByaXZhdGUgc3RhdGljIFN0cmluZ0J1aWxkZXIgYmZzKGludCBuLCBpbnQgbSwgaW50IHYsIGludFtdW10gYXJyLCBBcnJheUxpc3Q8UG9pbnQ+W10gaG9sZSwgUG9pbnQgc3RhcnQpIHsKCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKCQlpbnRbXVtdIGlzVmlzaXRlZCA9IG5ldyBpbnRbbiArIDFdW20gKyAxXTsKCQlpbnQgbWF4ID0gYXJyW3N0YXJ0LnJvd11bc3RhcnQuY29sXSwgbWluVGltZSA9IDA7CgkJCgkJUXVldWU8UG9pbnQ+IHEgPSBuZXcgTGlua2VkTGlzdDw+KCk7CgkJcS5vZmZlcihuZXcgUG9pbnQoc3RhcnQucm93LCBzdGFydC5jb2wpKTsKCQlpc1Zpc2l0ZWRbc3RhcnQucm93XVtzdGFydC5jb2xdID0gMTsgICAgIC8vIO2YhCDsnITsuZjsnZgg6rCSIOuwjyDrsKnrrLgg7Jes67aA66W8IOyggOyepe2VqeuLiOuLpC4g7Iuk7KCcIOyLnOqwhDogaXNWaXNpdGVkW3Jvd11bY29sXSAtIDEKCQkKCQl3aGlsZSghcS5pc0VtcHR5KCkpIHsKCQkJUG9pbnQgY3VycmVudCA9IHEucG9sbCgpOwogICAgICAgICAgICAvLyDtmITsnqwg7Iuc6rCE7JeQIOunnuy2sCDrqZTshozrk5zrpbwg7Zi47Lac7ZWY7JesIO2ZlOyCsCDsh4TshKTrpZjrpbwg642u7Ja07KSN64uI64ukLgoJCQlpZihpc1Zpc2l0ZWRbY3VycmVudC5yb3ddW2N1cnJlbnQuY29sXSA8IDIwMSkgY292ZXJpbmcobiwgbSwgdiwgaG9sZSwgaXNWaXNpdGVkW2N1cnJlbnQucm93XVtjdXJyZW50LmNvbF0pOwoJCQkKCQkJZm9yKGZpbmFsIGludFtdIERJUkVDVElPTjogRElSRUNUSU9OUykgewoJCQkJaW50IG5leHRSb3cgPSBjdXJyZW50LnJvdyArIERJUkVDVElPTltST1ddOwoJCQkJaW50IG5leHRDb2wgPSBjdXJyZW50LmNvbCArIERJUkVDVElPTltDT0xdOwoJCQkJCgkJCQlpZihuZXh0Um93IDwgMSB8fCBuZXh0Um93ID4gbiB8fCBuZXh0Q29sIDwgMSB8fCBuZXh0Q29sID4gbSkgY29udGludWU7CgkJCQlpZihpc1Zpc2l0ZWRbbmV4dFJvd11bbmV4dENvbF0gIT0gMCB8fCBpc1JlZFtuZXh0Um93XVtuZXh0Q29sXSkgY29udGludWU7ICAgIC8vIOydtOuvuCDrsKnrrLjtlojqsbDrgpgg7IeE7ISk66WY6rCAIOuNruy5nCDqsr3smrAKCQkJCWlzVmlzaXRlZFtuZXh0Um93XVtuZXh0Q29sXSA9IGlzVmlzaXRlZFtjdXJyZW50LnJvd11bY3VycmVudC5jb2xdICsgMTsKCQkJCQoJCQkJaWYoYXJyW25leHRSb3ddW25leHRDb2xdID4gbWF4KSBtYXggPSBhcnJbbmV4dFJvd11bbmV4dENvbF07CQkvLyDsnbTrj5ntlaAg7IiYIOyeiOuKlCDsp4Dsl60g7KSRIOy1nOuMgCDrhpLsnbQJCQoJCQkJcS5vZmZlcihuZXcgUG9pbnQobmV4dFJvdywgbmV4dENvbCkpOwoJCQl9CgkJfQoJCQoJCW1pblRpbWUgPSBnZXRNaW5UaW1lKG4sIG0sIGFyciwgaXNWaXNpdGVkLCBtYXgpOwoJCQoJCXNiLmFwcGVuZChtYXgpLmFwcGVuZChTUEFDRSkuYXBwZW5kKG1pblRpbWUgPT0gSW50ZWdlci5NQVhfVkFMVUUgPyAwIDogbWluVGltZSk7CgkJcmV0dXJuIHNiOwoJfQoJCglwcml2YXRlIHN0YXRpYyBpbnQgZ2V0TWluVGltZShpbnQgbiwgaW50IG0sIGludFtdW10gYXJyLCBpbnRbXVtdIHZpc2l0LCBpbnQgbWF4UG9zKSB7CgkJaW50IG1pbiA9IEludGVnZXIuTUFYX1ZBTFVFOwoJCQoJCWZvcihpbnQgaSA9IDE7IGkgPCBuICsgMTsgaSsrKSB7CgkJCWZvcihpbnQgaiA9IDE7IGogPCBtICsgMTsgaisrKSB7CgkJCQlpZihhcnJbaV1bal0gPT0gbWF4UG9zKSB7ICAgICAgICAvLyDstZzrjIAg64aS7J20IOqwkuydhCDqsJbripQg7ZaJ6rO8IOyXtOydmCDqsJLsnYQg7Ya17ZW0IOy1nOyGjCDsi5zqsITsnYQg7LC+7Iq164uI64ukLgoJCQkJCWlmKHZpc2l0W2ldW2pdIC0gMSA8IG1pbikgbWluID0gdmlzaXRbaV1bal0gLSAxOwoJCQkJfQoJCQl9CgkJfQoJCQoJCXJldHVybiBtaW47Cgl9CgkKCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDb3ZlcmVkKGludCBob2xlUm93LCBpbnQgaG9sZUNvbCwgaW50IHJvdywgaW50IGNvbCwgaW50IHRpbWUpIHsKCQlyZXR1cm4gdGltZSA+PSBNYXRoLmFicyhob2xlUm93IC0gcm93KSArIE1hdGguYWJzKGhvbGVDb2wgLSBjb2wpID8gdHJ1ZTogZmFsc2U7Cgl9CgkKCXByaXZhdGUgc3RhdGljIHZvaWQgY292ZXJpbmcoaW50IG4sIGludCBtLCBpbnQgdiwgQXJyYXlMaXN0PFBvaW50PltdIGhvbGUsIGludCB0aW1lcikgewoJCWZvcihpbnQgdCA9IDA7IHQgPCB0aW1lcjsgdCsrKSB7ICAgICAgICAgICAgLy8gdGltZXLripQg7ZiE7J6s6rmM7KeAIOqyveqzvOuQnCDsi5zqsITsnoXri4jri6QuIOymiSBpc1Zpc2l0ZWTsnZgg67Cw7Je06rCS7J6F64uI64ukLgoJCQlmb3IoUG9pbnQgcGFpcjogaG9sZVt0XSkgeyAgICAgICAgICAgICAgLy8gdOyLnOqwhOyXkCDtj63rsJztlZwg7ZmU7IKw7J20IOyeiOuLpOuptCAgICAgICAgICAKCQkJCWZvcihpbnQgcm93ID0gMTsgcm93IDwgbiArIDE7IHJvdysrKSB7CgkJCQkJZm9yKGludCBjb2wgPSAxOyBjb2wgPCBtICsgMTsgY29sKyspIHsKCQkJCQkJaWYoaXNSZWRbcm93XVtjb2xdKSBjb250aW51ZTsgICAgICAgIC8vIOydtOuvuCDtmZTsgrDsnbQg642u7J2AIOqzs+ydgCDrrLTsi5ztlanri4jri6QuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIO2YhOyerOq5jOyngCDqsr3qs7zsi5zqsIQodGltZXIsIGlzVmlzaXRlZCkgLSDtmZTsgrDsnbQg7Y+t67Cc7ZWcIOyLnOqwhCh0KSDqsJLsnLzroZwg66y47KCc7J2YIOyhsOqxtOuMgOuhnCDqs4TsgrDtlanri4jri6QuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIO2YhOyerOq5jOyngCDqsr3qs7zsi5zqsIQodGltZXIsIGlzVmlzaXRlZCkgLSDtmZTsgrDsnbQg7Y+t67Cc7ZWcIOyLnOqwhCh0KSA6IOusuOygnCDshKTrqoXsl5DshJwg7KO87Ja07KeEICfOtCcg65286rOgIOyDneqwge2WiOyKteuLiOuLpC4KCQkJCQkJaXNSZWRbcm93XVtjb2xdID0gaXNDb3ZlcmVkKHJvdywgY29sLCBwYWlyLnJvdywgcGFpci5jb2wsIHRpbWVyIC0gdCk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQp9Cg==