@sleepysoong

[프로그래머스][5번째로 푼 문제] 120866. 안전지대 (240731) 본문

programming/잘 하는 언어는 없지만 문제는 풀어보고 싶어!

[프로그래머스][5번째로 푼 문제] 120866. 안전지대 (240731)

sleepysoong 2024. 11. 12. 14:12

구분

코딩테스트 연습 > 코딩테스트 입문

제출 일자

2024년 07월 31일 17:08:44

문제 설명

다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.

지뢰 지역 이미지

지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설된 지역 1과, 지뢰가 없는 지역 0만 존재합니다. 지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.

제한사항

  • board는 n * n 배열입니다.
  • 1 ≤ n ≤ 100
  • 지뢰는 1로 표시되어 있습니다.
  • board에는 지뢰가 있는 지역 1과 지뢰가 없는 지역 0만 존재합니다.

입출력 예

board result
[[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
[[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
[[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
def is_true(value):
    return value

def solution(board):
    field = {}
    bomb = []
    for x in range(len(board)):
        for y in range(len(board[x])):
            field[(x, y)] = True
            if board[x][y] == 1:
                bomb.append((x, y))
    for bombX, bombY in bomb:
        for x in range(bombX - 1, bombX + 2):
            for y in range(bombY - 1, bombY + 2):
                if (x, y) in field:
                    field[(x, y)] = False
    return len(list(filter(is_true, field.values())))

느낀점

1학기 인천대학교 컴퓨터공학부 학생회 - 1학기 학술행사 마리오를 찾아라에서 푼 미역! 줄기! 다시마! 문제가 떠오르는 문제였다.

이정민, 김대호, dlstn1612@gmail.com, daphne 외 28 명님의 풀이

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)

풀고 나서 나의 소스를 리뷰해보니 왜 굳이 일반 구역까지 field에 넣었을까? 그냥 전체 구역 수에서 위험한 구역을 빼면 되잖아!라고 생각했는데 역시나 고수들은 이런 식으로 효율적으로 작성했다.

dangerset으로 하고 update 함수를 쓴 것과 enumerate를 쓴 것까지 와우...
엄마, 나 무슨 과로 전과할까?