[프로그래머스] LV.0 - 안전지대 | 파이썬

SangJin Ham·2023년 6월 26일
0

프로그래머스

목록 보기
1/20
post-thumbnail

코딩테스트 역량 강화 교육(거점형 특화 프로그램)이라는 프로그램에 참여해 공부한 내용입니다.

LV.0 - 안전지대

앞서 공부한 시뮬레이션 알고리즘을 사용해 안전지대 문제를 풀어보겠다.


문제 설명

다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.

지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.


제한사항

  • board는 n * n 배열입니다.
  • 1 ≤ n ≤ 100
  • 지뢰는 1로 표시되어 있습니다.
  • board에는 지뢰가 있는 지역 1과 지뢰가 없는 지역 0만 존재합니다.

입출력 예

입력(board)출력(result)
[[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
[[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
[[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

입출력 예 설명

입출력 예 #1

(3, 2)에 지뢰가 있으므로 지뢰가 있는 지역과 지뢰와 인접한 위, 아래, 좌, 우, 대각선 총 8칸은 위험지역입니다. 따라서 16을 return합니다.

입출력 예 #2

(3, 2), (3, 3)에 지뢰가 있으므로 지뢰가 있는 지역과 지뢰와 인접한 위, 아래, 좌, 우, 대각선은 위험지역입니다. 따라서 위험지역을 제외한 칸 수 13을 return합니다.

입출력 예 #3

모든 지역에 지뢰가 있으므로 안전지역은 없습니다. 따라서 0을 return합니다.


코드

def solution(board):
    # 방향배열
    dr = [-1, 1, 0, 0, -1, -1, 1, 1]
    dc = [0, 0, -1, 1, -1, 1, -1, 1]
    
    # board가 n*n이라는 조건
    n = len(board)
    
    # 지뢰 확인 for문
    for i in range(n):
        for j in range(n):
            if board[i][j] == 1:
            # 위험 지역 추가
                for k in range(8):
                    nr = i + dr[k]
                    nc = j + dc[k]   
                    # 위험지역은 2로 표시
                    if 0 <= nr < n and 0 <= nc < n:
                        if board[nr][nc] != 1:
                            board[nr][nc] = 2

    # 지뢰와 위험지역은 1, 2이므로 0만 카운팅
    answer = 0
    for i in range(n):
        for j in range(n):
            if board[i][j] == 0:
                answer += 1
    return answer

풀이

  1. 방향 배열 dr, dc12시부터 시계방향으로 설정
  2. 모든 board의 원소를 돌면서 if board[i][j] == 1 즉, 현재 위치가 지뢰인지 확인
  3. 지뢰라면 인근지역에 또 지뢰가 있다면 제외하고 나머지 지역을 위험지역(2)으로 설정
  4. board의 모든 원소를 돌았다면, 원소 중 0인 지역 즉, 안전한 지역만 카운팅해 return
profile
끄적끄적

0개의 댓글