안전지대 - Python

2023. 10. 1. 20:45공부/📝 프로그래머스

def solution(board):
    answer = 0
    n, m = len(board), len(board[0])
    
    check_list = [[0] * (m + 2) for _ in range(n + 2)]
    
    for i in range(n):
        for j in range(m):
            check_list[i + 1][j + 1] = board[i][j]

    for i in range(1, n + 1):
        for j in range(1, m + 1):
            temp = (
                check_list[i][j] + check_list[i - 1][j - 1]
                + check_list[i][j - 1] + check_list[i + 1][j - 1]
                + check_list[i - 1][j] + check_list[i + 1][j]
                + check_list[i - 1][j + 1] + check_list[i][j + 1]
                + check_list[i + 1][j + 1]
            )
            if temp == 0:
                answer += 1
    return answer

# Test Cases
print(solution([[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]]))
print("=" * 50)
print(solution([[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]]))
print("=" * 50)
print(solution([[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]]))
print("=" * 50)

  위와 같이 풀었습니다.

 


def solution(board):
    answer = 0

    for col in range(len(board)):
        for row in range(len(board[col])):
            if board[row][col] == 1:
                for j in range(max(col-1,0),min(col+2,len(board))):
                    for i in range(max(row-1,0),min(row+2,len(board))):
                        if board[i][j] == 1:
                            continue
                        board[i][j] = -1
    for i in board:
        answer += i.count(0)

    return answer

  min(), max()로 경계선을 정하는게 좋습니다.

 


def solution(board):
    n = len(board)
    danger = set()
    for i, row in enumerate(board):
        for j, x in enumerate(row):
            if not x:
                continue
            danger.update((i+di, j+dj) for di in [-1,0,1] for dj in [-1, 0, 1])
    return n*n - sum(0 <= i < n and 0 <= j < n for i, j in danger)

  대단한 코드인 듯 합니다. ChatGPT한테 물어봤습니다.

 

이 코드는 2D 격자판 board에서 안전한 지역과 위험한 지역을 판별하고, 안전한 지역의 개수를 반환하는 함수입니다. 이 코드를 통해 안전한 지역은 격자판 내부에 위치하고 있으며, 위험한 지역은 격자판의 가장자리 부분에 위치하는 것으로 가정합니다.

이 코드는 다음과 같은 주요 단계로 동작합니다:

n = len(board): 격자판의 크기를 계산하여 한 변의 길이(n)를 저장합니다.

danger = set(): 위험 지역의 좌표를 저장하기 위한 빈 집합(set)을 생성합니다.

중첩된 for 루프를 사용하여 board의 각 셀을 순회합니다. i와 j는 각각 현재 셀의 행과 열을 나타냅니다.

if not x:: 현재 셀의 값 x가 0이면, 즉, 현재 위치가 안전한 지역이라면 아무 작업도 수행하지 않고 다음 셀로 넘어갑니다.

danger.update((i+di, j+dj) for di in [-1,0,1] for dj in [-1, 0, 1]): 현재 셀이 안전하지 않은(1로 표시된) 경우, 해당 셀의 주변 8개 인접 셀을 danger 집합에 추가합니다. 이를 통해 위험 지역의 좌표가 저장됩니다. 위험 지역은 격자판의 가장자리에 위치하므로, 가장자리에 위치한 셀의 주변 셀을 danger 집합에 추가함으로써 감지합니다.

return n*n - sum(0 <= i < n and 0 <= j < n for i, j in danger): 전체 격자판의 총 셀 수인 n * n에서 위험 지역의 수를 뺀 값을 반환합니다. sum(0 <= i < n and 0 <= j < n for i, j in danger)는 위험 지역 중에서 실제로 격자판 안에 속하는 셀의 수를 계산합니다. 이를 전체 셀 수에서 빼면 안전한 지역의 수가 됩니다.

코드는 격자판의 안전한 지역을 계산하는 간단하면서도 효과적인 방법을 사용하고 있습니다.

 


 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

'공부 > 📝 프로그래머스' 카테고리의 다른 글

옹알이 (1) - Python  (0) 2023.10.02
겹치는 선분의 길이 - Python  (0) 2023.10.01
연속된 수의 합 - Python  (0) 2023.10.01
다음에 올 숫자 - Python  (0) 2023.10.01
OX퀴즈 - Python  (0) 2023.10.01