이롭게 현명하게
[programmers - 120866] Lv0 안전지대 / Python 본문
문제
풀이
코드설명
코드
[programmers - 120866] Lv0 안전지대 / Python
[🔗문제🔗]
[제한사항]
[입출력 예시]
번호 | 입력 | 출력 |
1 | [[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 |
2 | [[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 |
3 | [[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 |
[풀이]
BFS,완전탐색
처음에 문제를 어떻게 풀어야 하나 생각이 많았다.
그래서 무식하게 풀면 되는 건 줄 알았다.
으앙 부끄렁
'''
for i in range(len(board)):
# print(board[i])
for j in range(len(board[i])):
if board[i][j] ==1:
if i-1<0 or i+1>len(board):
continue
elif j-1<0 or j+1>len(board):
continue
else:
# 위
if board[i-1][j]==1:
pass
else:
board[i-1][j]=2
# 아래
if board[i+1][j]==1:
pass
else:
board[i+1][j]=2
# 좌
if board[i][j-1]==1:
pass
else:
board[i][j-1]=2
# 우
if board[i][j+1]==1:
pass
else:
board[i][j + 1] = 2
# 왼쪽 위 대각선
if board[i-1][j-1]==1:
pass
else:
board[i-1][j-1]=2
# 오른쪽 위 대각선
if board[i-1][j+1]==1:
pass
else:
board[i-1][j+1]=2
# 왼쪽 아래 대각선
if board[i+1][j-1]==1:
pass
else:
board[i+1][j-1]=2
# 오른쪽 아래 대각선
if board[i+1][j+1]==1:
pass
else:
board[i+1][j+1]=2
# 으앙 부끄렁
'''
BFS, 완전탐색을 이용해서 푸는 문제라고 하는데 아직 이 알고리즘은 감이 안와 여러 블로그를 보면서 알고리즘에 대한 이해보다 문제에 대한 이해를 했다.
입출력 1번의 2차원 배열은 [[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]] 이다. 지뢰는 (3,2)의 위치에 있다.
지뢰에 인접한 위, 아래, 좌, 우, 대각선 칸은 모두 위험지역이다.
이 때 지뢰가 있는 (3,2)를 기준으로 행은 -1,-1,-1,0,0,+1,+1,+1 위험지대 위치이다.
왼쪽 위 대각선,위,오른쪽 위 대각선 : -1
오른쪽, 왼쪽 : 0
왼쪽 아래 대각선 , 아래 , 오른쪽 아래 대각선 : +1
이 때 지뢰가 있는 (3,2)를 기준으로 열은 -1,0,+1,-1,0,+1,-1,0,+1 위험지대 위치이다.
왼쪽 위 대각선,왼쪽,왼쪽 아래 대각선: -1
위, 아래 : 0
오른쪽 위 대각선, 오른쪽, 오른쪽 아래 대각선 : +1
지뢰의 위치(0,0)를 기준으로 2차원 배열을 x,y좌표로 표현하여 위험지대의 위치는 (-1,-1),(-1,0),(-1,1),(0,-1),(0,1),(1,-1),(1,0),(1,1)로 총 8방향이 나오는 것을 알 수 있다.
[코드설명]
dx = [-1, 1, 0, 0, -1, -1, 1, 1] dy = [0, 0, -1, 1, -1, 1, -1, 1] |
dx : 2차원 배열의 행 [상,하,좌,우,대각선] dy : 2차원 배열의 열 [상,하,좌,우,대각선] |
boom = [] | 지뢰의 위치 |
for i in range(len(board)): for j in range(len(board)): if board[i][j] == 1: boom.append((i, j)) |
지뢰의 위치를 찾아 boom에 위치 값 저장 |
for x, y in boom: for i in range(8): nx = x + dx[i] ny = y + dy[i] if 0 <= nx < n and 0 <= ny < n: board[nx][ny] = 1 |
지뢰 위치를 기준으로 위험지대 좌표값 설정 if문 ) 2차원 배열을 벗어나는 위치일 경우 |
for i in board: answer += i.count(0) |
안전지대 갯수 |
<코드>
# [Programmers - 120866] 안전지대
def solution(board):
answer = 0
n = len(board)
dx = [-1, 1, 0, 0, -1, -1, 1, 1]
dy = [0, 0, -1, 1, -1, 1, -1, 1]
boom = []
for i in range(len(board)):
for j in range(len(board)):
if board[i][j] == 1:
boom.append((i, j))
for x, y in boom:
for i in range(8):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < n and 0 <= ny < n:
board[nx][ny] = 1
for i in board:
answer += i.count(0)
return answer
[후기]
레벨 0이라고해서 쉬울줄 알았더니 조금 어려웠다..
잘못된 정보는 댓글에 남겨주시면 감사하겠습니다!😊
댓글과 좋아요는 큰 힘이 됩니다!
'알고리즘 > programmers' 카테고리의 다른 글
[programmers - 120956] Lv0 옹알이 (1) / Python (0) | 2023.08.28 |
---|---|
[programmers - 120875] Lv0 평행 / Python (0) | 2023.08.25 |
[programmers - 120876] Lv0 겹치는 선분의 길이/ Python (0) | 2023.08.24 |