📃문제설명
다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.
지뢰는 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합니다.
💻코드
import numpy as np
from collections import Counter
def solution(board):
new = np.pad(board, ((1, 1), (1, 1)), constant_values=-1)
board = np.pad(board, ((1, 1), (1, 1)), constant_values=-1)
for i in range(len(board)):
for j in range(len(board)):
if board[i][j] == 1:
for x in range(i-1, i+2):
for y in range(j-1, j+2):
new[x][y] = 1
danger_list = np.reshape(new, (1, -1)).squeeze()
answer = Counter(danger_list)[0]
return answer
'''import numpy as np
def solution(board):
board = np.array(board)
for a, b in zip(*np.where(board == 1)):
board[a-1 if a else 0:a+2, b-1 if b else 0:b+2] = 1
return len(board[board == 0])
'''
🧑💻공부
board = np.array(board): 주어진 board를 NumPy 배열로 변환한다.
이렇게 하면 배열을 쉽게 다룰 수 있다.
for a, b in zip(*np.where(board == 1)):: board에서 값이 1인 요소의 인덱스를 찾는다.
np.where(board == 1)을 사용하여 값이 1인 요소의 인덱스를 얻은 후,
zip 함수를 사용하여 각 요소의 인덱스를 (a, b)로 가져온다.
이렇게 하면 board에서 값이 1인 요소의 위치를 하나씩 가져올 수 있다.
board[a-1 if a else 0:a+2, b-1 if b else 0:b+2] = 1: board에서 위험 지역 주변을 1로 설정한다.
a와 b는 위에서 가져온 값이므로, 해당 위치 주변의 인덱스를 이용하여 슬라이싱한 부분을 1로 설정한다.
a와 b가 0인 경우에는 인덱스를 음수로 설정하지 않도록 조건문을 사용한다.
return len(board[board == 0]): 위험 지역이 아닌 (값이 0인) 요소의 개수를 반환한다.
board == 0은 board에서 값이 0인 요소를 True로, 그 외의 요소를 False로 반환하는 불리언 배열을 생성한다. board[board == 0]은 값이 0인 요소들만 선택한 후, len 함수를 사용하여 개수를 계산한다.
'🐍python3 > Programmers' 카테고리의 다른 글
프로그래머스[코딩테스트 입문]_외계어 사전 (0) | 2023.06.04 |
---|---|
프로그래머스[코딩테스트 입문]_삼각형의 완성조건 (2) (0) | 2023.06.04 |
프로그래머스[코딩테스트 입문]_숨어있는 숫자의 덧셈 (2) (0) | 2023.06.04 |
프로그래머스[코딩테스트 입문]_다항식 더하기 (0) | 2023.06.04 |
프로그래머스[코딩테스트 입문]_최댓값 만들기 (2) (0) | 2023.06.04 |