티스토리 뷰

Python

[프로그래머스] 안전지대

up_one 2025. 5. 20. 12:33

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

배열 board은 지뢰가 있는 지역은 1, 지뢰가 없는 지역은 0으로 저장되어 있습니다. 위험지역은 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우, 대각선 칸을 포함합니다. 지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 반환하는 solution 함수를 완성해 주세요

 

Test Case 1) 지뢰가 (3,2)에 위치할 때 위험 지역은 총 8칸, 따라서 안전한 지역의 칸 수는 16

 

  1. board [i][j]가 1인 곳부터 탐색하기
    • 지뢰 지역(board [i][j]=1) 인접한 곳이 위험 지역이므로 그 지역부터 8방향 탐색을 진행
  2. 8방향 탐색 방법
    • dx = [-1,-1,0,1,1,1,0,-1]
    • dy = [0,1,1,1,0,-1,-1,-1]
  3. 격자판을 벗어나는 기준과 옮긴 위치가 1인 경우를 제외
    • nx : 옮긴 위치의 x 좌표
    • ny :  옮긴 위치의 y 좌표
    • 옮긴 위치가 격자판 안에 있고, 방문하지 않은 곳인지를 확인
  4. 옮긴 위치가 1이 아닌 경우, 위험 지역의 수를 더해주고 방문 여부를 방문으로 바꿔주기
  5. 안전 지역의 수 = 전체 격자판 수 - (지뢰 지역의 수 + 지뢰 지역과 인접한 지역의 수)
def solution(board):
    answer = 0   #위험지역 수
    dx = [-1,-1,0,1,1,1,0,-1]
    dy = [0,1,1,1,0,-1,-1,-1]
    checked = [[False for col in range(len(board))] for row in range(len(board))]

    for i in range(len(board)):
        for j in range(len(board)):
            if board[i][j]==1:
                for k in range(8):
                    nx = i + dx[k]
                    ny = j + dy[k]
                    if nx>=0 and ny>=0 and nx<len(board) and ny<len(board) and checked[nx][ny]==False:
                        if board[nx][ny]!=1:
                            checked[nx][ny]=True
                            answer+=1
                    
    return len(board)*len(board)-(sum(row.count(1) for row in board)+answer)

 

* 2차원 배열에서 특정값의 개수 구하기

-> sum(row.count(특정값) for row in 배열)

TAG more
글 보관함
최근에 올라온 글