핀아의 저장소 ( •̀ ω •́ )✧
[Programmers] Lv.0 안전지대 본문
📖 문제
💡 해설
import numpy as np
from collections import Counter
def solution(board):
n = len(board)
ori = np.pad(board, ((1, 1), (1, 1)), constant_values = -1)
danger = np.pad(board, ((1, 1), (1, 1)), constant_values = -1)
for i in range(1, n+1):
for j in range(1, n+1):
if ori[i][j] == 1:
for x in range(i-1, i+2):
for y in range(j-1, j+2):
danger[x][y] = 1
danger_list = danger.reshape(1, -1).squeeze()
answer = Counter(danger_list)[0]
이게 Lv0에서 나올 문제 맞나 ㅠㅠ 했던 문제.....
보통 이렇게 다차원의 문제는 BFS? 사용해서 푼다는데 아직 자료구조 개념을 잘 몰라서.... 다른 분들 풀이를 찾아보다가 가장 쉽게 이해가 됐던 코드를 보고 답을 제출했다.
Numpy _ np.pad()
패딩이란 대충 배열 테두리를 감싸주는 작업이라고 생각하면 된다.
import numpy as np np.pad(array, pad_width=((a, b), (c, d)), mode='constant', constant_values=0 )
- array: 패딩을 할 배열
- pad_width: 테두리를 몇 줄 만들 지 지정 (a: 위쪽 행, b: 아래쪽 행, c: 왼쪽 열, d: 오른쪽 열)
- mode: pad method를 적용하는 모드를 지정함 (기본값은 constant)
- constant: 특정한 값으로 테두리를 추가
- edge: 원본 배열에서 가장 가까운 모서리에 있는 값으로 테두리 추가
- maximum: 특정 테두리 위치에 존재하는 값에서 행/열에 있는 최대값으로 테두리 추가
- constant_values: 테두리에 채워 넣을 상수값 (기본값은 0)
Counter클래스는 안전한 구역인 0의 개수를 셀 때 사용한다.
- ori = np.pad(board, ((1, 1), (1, 1)), constant_values = -1): 상, 하, 좌, 우 1개의 테두리를 추가한다는 뜻이고 그 때 그 테두리 값은 -1로 지정한다.
문제에서 폭탄 주변 인근 8개만 위험구역이므로, 상하좌우로 1줄 씩만 추가해주면 된다. - 이후 똑같은 danger를 생성해준다. ori 만 이용하지 않은 이유는 폭탄(1)이 존재할 경우 주변을 1로 처리해줘야 하는데 이 경우 폭탄인지 위험지역인지 헷갈리기 때문이다.
- for문이 1부터 시작하는 이유는 0번 인덱스같은 경우 어차피 패딩된 자리이기 때문에 확인해 줄 필요가 없다.
- ori[i][j] == 1 이면 danger의 똑같은 자리에도 1로 만들어준 다음 0의 개수만 세서 답을 출력해주면 된다.
참고:
'Computer Science > 코딩테스트_Python' 카테고리의 다른 글
[Programmers] Lv.0 최댓값 만들기 (2) (0) | 2023.04.20 |
---|---|
[Programmers] Lv.0 합성수 찾기 (0) | 2023.04.20 |
[Programmers] Lv.0 공 던지기 (0) | 2023.04.20 |
[Programmers] Lv.0 각도기 (0) | 2023.04.18 |
[Programmers] Lv.0 짝수 홀수 개수 (0) | 2023.04.18 |
Comments