문제
https://school.programmers.co.kr/learn/courses/30/lessons/120866
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.

지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.
제한사항
- board는 n * n 배열입니다.
- 1 ≤ n ≤ 100
- 지뢰는 1로 표시되어 있습니다.
- board에는 지뢰가 있는 지역 1과 지뢰가 없는 지역 0만 존재합니다.
아이디어
이것도 약간 케이스를 나눠서 생각해야하는 문제이다.
폭탄의 위치를 (row,col)이라고 한다면 ( -1, +0, +1)을 각 row와 col에 해준 위치를 다 살펴봐야한다.

폭탄이 항상 가운데만 아주 쉬운 문제이겠지만 폭탄이 테두리에 있을 경우를 다 생각해줘야한다.
row 또는 col이 0이라면 폭탄이 테두리에 있게 된다. 그런 경우 (+1, -1) 할때 신경써서 하면 쉽게 해결할 수 있다.
풀이
폭탄주변 위험지역이라면 2로 만들어 준다.
n이 1인 경우, 안전지역은 무조건 0이므로 먼저 확인해야한다.
폭탄이 연속으로 있는 자리를 지날때 폭탄의 자리를 바꾸면 안되기 때문에 폭탄이 있는 자리도 피해서 위험지역을 표시한다.
def solution(board):
length = len(board)
if length == 1 :
return 0 if board[0][0] == 1 else 1
for row in range(length):
for col in range(length):
if board[row][col] == 1:
rstart, cstart = -1, -1
rend, cend = 2, 2
# 제일 마지막인 경우
if row == 0: rstart = 0
elif row == length-1: rend = 1
if col == 0: cstart = 0
elif col == length -1: cend = 1
for i in range(rstart, rend):
for j in range(cstart, cend):
if i == 0 and j == 0: continue
if board[row+i][col+j] == 1:continue
board[row+i][col+j] = 2
answer = [j for i in board for j in i]
return answer.count(0)
'프로그래밍 > Python' 카테고리의 다른 글
[프로그래머스] 다음에 올 숫자 / Python (0) | 2023.05.14 |
---|---|
[프로그래머스] 연속된 수의 합 / Python (0) | 2023.05.14 |
[프로그래머스] 겹치는 선분의 길이 (0) | 2023.05.14 |
[프로그래머스] 평행 / python (1) | 2023.05.14 |
[프로그래머스] 옹알이 / Python (0) | 2023.05.13 |
댓글