본문 바로가기

프로그래머스/lv0

안전지대

/* 안전지대
 * 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류
 * 지뢰는 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 = {{00000}, {00000}, {00000}, {00100}, {00000}};
    static int[][] a2 = {{00000}, {00000}, {00000}, {00110}, {00000}};
    static int[][] a3 = {{111111}, {111111}, {111111}, {111111}, {111111}, {111111}};
    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. 전체 크기 - 위험지역

 

위험지역 범위 체크에 있어 보다 간단하게 할 수 있을듯하다..

추후 다시 풀 예정.

'프로그래머스 > lv0' 카테고리의 다른 글

평행  (0) 2022.12.09
저주의 숫자 3  (0) 2022.12.07
특이한 정렬  (2) 2022.12.07
유한소수 판별하기  (0) 2022.12.07
직사각형의 넓이  (1) 2022.12.07