프로그래머스, 안전지대 (python)

이도현·2023년 10월 30일
0

알고리즘 문제풀이

목록 보기
20/24

0. 문제

1. 문제 풀이

def solution(board):
    n = len(board)
    
    directions = [(1,0), (0,1), (-1,0), (0,-1), (1,1), (1, -1), (-1,1), (-1,-1)]
    
    def is_valid(x,y):
        return 0 <= x < n and 0 <= y < n
    
    for i in range(n):
        for j in range(n):
            if board[i][j] == 1:
                for dx, dy in directions:
                    nx, ny = i + dx, j + dy
                    if is_valid(nx, ny) and board[nx][ny] == 0:
                        board[nx][ny] = 2
                            
    
    safe_area = sum(row.count(0) for row in board)
    
    
    return safe_area
  • board를 순회하며 만약 1이라면 안전하지 않으니 주변을 2로 바꾸고
  • 끝나면 0의 숫자를 세는 아이디어
  • directions, 상,하,좌,우,대각선 확인
  • is_valid, 확인 중 board의 인덱스 범위를 벗어나는지 아닌지 확인하는 함수

2. 다른사람 풀이

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)
  • enumerate는 iterable(예: 리스트, 튜플, 문자열 등)을 순회할 때, 각 아이템과 함께 해당 아이템의 인덱스를 반환하는 함수
  • n은 board의 크기, danger은 위험안 셀의 위치를 저장
  • 위험한 셀 탐색: 각 셀을 순회하며 x가 아닌 경우(조건을 만족하는 경우)
  • 안전한 셀 계산: n * n에서 danger 집합에 포함된 유효한 셀의 개수를 빼서, 안전한 셀의 개수를 반환
profile
좋은 지식 나누어요

0개의 댓글