[프로그래머스][파이썬] 안전지대 - 시뮬레이션 (Level 0)

뻥튀기아이스크림·2025년 3월 24일
1
post-thumbnail

◽ 문제 출처

https://school.programmers.co.kr/learn/courses/30/lessons/120866

◽ 문제

◽ 입력 & 출력

◽ 내 풀이

def solution(board):
    N = len(board)
    dx = [-1, 1, 0, 0, -1, -1, 1, 1] # 8방향 탐색
    dy = [0, 0, -1, 1, -1, 1, -1, 1]
    
    # 지뢰 설치
    boom = []
    for i in range(N):
        for j in range(N):
            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

    # 폭탄이 설치되지 않은 곳만 카운팅
    count = 0
    for x in range(N):
        for y in range(N):
            if board[x][y] == 0:
                count += 1
                
    return count
  • 8 방향 탐색을 위해 상, 하, 좌, 우, 좌상, 우상, 좌하, 우하 방향 순으로 dx, dy 배열을 만들었다. 위로 이동할 경우 [-1, 0] 좌표 이동을 한다고 이해할 수 있다.
  • 처음에는 그냥 폭탄 주위에 다 1 을 더하려고 했는데, 그러면 원래 폭탄이 어디있었는지 모르게 되어버려서 새로운 boom 배열에 저장하기로 했다.
  • 그리고 지뢰가 설치된 곳 주변에 x + dx[i] 처럼 좌표 이동 연산을 통해 1 을 대입했다.
  • 대신, 좌표 범위를 넘으면 안되니 범위를 체크한 후 대입했다.
  • 마지막으로 폭탄이 설치되지 않은 곳을 찾아 개수를 더했다.

◽ 다른 사람 풀이

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)
  • i 는 행의 인덱스, row 는 해당 행의 리스트이고, j 는 열의 인덱스, x 는 해당 위치의 값이다.
  • if not x 를 통해 폭탄이 없다면 다음으로 넘어가고, 폭탄이 있다면 해당 위치를 포함한 8방향 이동한 위치, 총 9 개의 위치를 danger 에 추가한다.
  • 마지막으로 좌표 총 위치 개수에서 범위를 넘지 않는 좌표들만 뽑아 개수를 빼주는 풀이이다.

◽ 더 나아가기

  • enumerate() 함수는 반복 가능한 객체를 순회할 때, 각 요소와 함께 해당 요소의 인덱스도 함께 제공하는 파이썬 내장 함수이다.
  • update() 함수는 set 자료형의 메서드로, 기존 집합에 여러 요소를 한꺼번에 추가할 때 사용된다. 이때 추가되는 요소들은 반복 가능한 객체여야 한다.
  • 개수를 구해야하는 문제에서는 하나하나 개수를 늘려가는 방향도 좋지만, 전체 경우의 수에서 해당하지 않는 경우의 수를 빼는 방법도 생각하자.



피드백은 언제나 환영입니다 :)

profile
성장하고 싶은 개발자

0개의 댓글