이롭게 현명하게

[programmers - 120866] Lv0 안전지대 / Python 본문

알고리즘/programmers

[programmers - 120866] Lv0 안전지대 / Python

dev_y.h 2023. 8. 19. 20:49
728x90
반응형


문제

풀이

코드설명

코드


[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이라고해서 쉬울줄 알았더니 조금 어려웠다..


잘못된 정보는 댓글에 남겨주시면 감사하겠습니다!😊

댓글과 좋아요는 큰 힘이 됩니다!

728x90
반응형
Comments