/* 안전지대
* 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류
* 지뢰는 2차원 배열 board에 1로 표시되어 있고
* board에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
* 지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return
*
* board
* [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 0, 0]]
* > 16 : (3, 2)에 지뢰가 있으므로 지뢰가 있는 지역과 지뢰와 인접한
* 위, 아래, 좌, 우, 대각선 총 8칸은 위험지역입니다. 따라서 16을 return
* [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 1, 0], [0, 0, 0, 0, 0]]
* > 13 : (3, 2), (3, 3)에 지뢰가 있으므로 지뢰가 있는 지역과 지뢰와 인접한
* 위, 아래, 좌, 우, 대각선은 위험지역입니다. 따라서 위험지역을 제외한 칸 수 13을 return
* [[1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1]]
* > 0 : 모든 지역에 지뢰가 있으므로 안전지역은 없습니다. 따라서 0을 return
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
import java.util.*;
public class programmer_0_93 {
static int[][] a1 = {{0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 1, 0, 0}, {0, 0, 0, 0, 0}};
static int[][] a2 = {{0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 1, 1, 0}, {0, 0, 0, 0, 0}};
static int[][] a3 = {{1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1}};
public int solution(int[][] board) {
int length = board.length;
int answer = length * length;
String idx = "";
Map<String,Integer> map = new HashMap<String,Integer>();
for(int i = 0; i < length; i++){
for(int k = 0; k < length; k++){
if(board[i][k] == 1){
//지뢰위치
idx = i + "/" + k;
map.put(idx, map.getOrDefault(idx, 0) + 1);
//세로
idx = (i+1) + "/" + k;
if((i+1) < length) map.put(idx, map.getOrDefault(idx, 0) + 1);
idx = (i-1) + "/" + k;
if((i-1) >= 0) map.put(idx, map.getOrDefault(idx, 0) + 1);
//가로
idx = i + "/" + (k+1);
if((k+1) < length) map.put(idx, map.getOrDefault(idx, 0) + 1);
idx = i + "/" + (k-1);
if((k-1) >= 0) map.put(idx, map.getOrDefault(idx, 0) + 1);
//대각선
idx = (i+1) + "/" + (k-1);
if((k-1) >= 0 && (i+1) < length) map.put(idx, map.getOrDefault(idx, 0) + 1);
idx = (i-1) + "/" + (k+1);
if((k+1) < length && (i-1) >= 0) map.put(idx, map.getOrDefault(idx, 0) + 1);
idx = (i+1) + "/" + (k+1);
if((k+1) < length && (i+1) < length) map.put(idx, map.getOrDefault(idx, 0) + 1);
idx = (i-1) + "/" + (k-1);
if((k-1) >= 0 && (i-1) >= 0 ) map.put(idx, map.getOrDefault(idx, 0) + 1);
}
}
}
return answer - map.size();
}
public static void main(String args[]){
programmer_0_93 t = new programmer_0_93();
// System.out.println("---------------------------------------");
// System.out.println("result = " + t.solution(a1));
System.out.println("---------------------------------------");
System.out.println("result2 = " + t.solution(a2));
System.out.println("---------------------------------------");
// System.out.println("result3 = " + t.solution(a3));
// System.out.println("---------------------------------------");
}
}
|
cs |
<풀이방법>
1. 지뢰 위치 조회
2. 위험 지역 조회(Map의 형태로 getOrDefault를 사용하여 위험지역 x,y좌표 등록)
3. 전체 크기 - 위험지역
위험지역 범위 체크에 있어 보다 간단하게 할 수 있을듯하다..
추후 다시 풀 예정.