[프로그래머스] Lv.0 안전지대 파이썬 코드 풀이

2023. 1. 24. 23:00프로그래밍/자료구조 및 알고리즘

반응형

문제설명


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


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

 


나의 풀이


핵심은, 지뢰의 좌표를 구하여서, 그 주변 8방향에 대해 지뢰를 추가적으로 설치한 후에, 지뢰가 없는 지역을 세주면 된다.

객체지향 프로그래밍 연습을 해보기 위해 아래와 같이 구현해보았다.

class Mine():
    def __init__(self, board):
        self.coord = board
        self.N = len(board)
        
    def check_mine_position(self):
        mine_pos = []
        for x in range(self.N):
            for y in range(self.N):
                if self.coord[x][y] == 1 :
                    mine_pos.append((x,y))
        return mine_pos
        
    def set_bomb(self, mine):
        # 11, 12, 1
        # 9, 3
        # 7, 6, 5
        dx = [-1, 0, 1, -1, 1, -1, 0, 1]
        dy = [1, 1, 1, 0, 0, -1, -1, -1]
        for x, y in mine : 
            if self.coord[x][y] == 1:
                for i in range(8):
                    nx = x + dx[i]
                    ny = y + dy[i]
                    # inside the board
                    if 0 <= nx < self.N and 0<= ny <self.N :
                        self.coord[nx][ny] = 1
        
    def check_board(self):
        print(self.coord)
        
    def count_safezone(self):
        count = 0
        for x in range(self.N):
            for y in range(self.N):
                if self.coord[x][y] == 0 :
                    count += 1
        return count


def solution(board):
    a = Mine(board)
    # 지뢰의 좌표 체크
    mine = a.check_mine_position()
    # 지뢰 주변에 지뢰 설치
    a.set_bomb(mine)
    # a.check_board()    
    # 지뢰이 설치되지 않은 좌표의 수 세기
    return a.count_safezone()

 

반응형