핀아의 저장소 ( •̀ ω •́ )✧

[Programmers] Lv.0 안전지대 본문

Computer Science/코딩테스트_Python

[Programmers] Lv.0 안전지대

_핀아_ 2023. 4. 21. 02:05

📖 문제

 

💡 해설

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의 개수만 세서 답을 출력해주면 된다.

 

 

참고:

https://velog.io/@seulki971227/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv.0-%EC%95%88%EC%A0%84%EC%A7%80%EB%8C%80-Python

Comments