본문 바로가기
프로그래밍/Python

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

by 나는 라미 2023. 5. 14.
728x90
반응형

문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

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

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

 

제한사항

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

 

 

아이디어

이것도 약간 케이스를 나눠서 생각해야하는 문제이다.

폭탄의 위치를 (row,col)이라고 한다면 ( -1, +0, +1)을 각 row와 col에 해준 위치를 다 살펴봐야한다. 

폭탄이 항상 가운데만 아주 쉬운 문제이겠지만 폭탄이 테두리에 있을 경우를 다 생각해줘야한다.

row 또는 col이 0이라면 폭탄이 테두리에 있게 된다. 그런 경우 (+1, -1) 할때 신경써서 하면 쉽게 해결할 수 있다.

 

풀이

폭탄주변 위험지역이라면 2로 만들어 준다.

n이 1인 경우, 안전지역은 무조건 0이므로 먼저 확인해야한다.

폭탄이 연속으로 있는 자리를 지날때 폭탄의 자리를 바꾸면 안되기 때문에 폭탄이 있는 자리도 피해서 위험지역을 표시한다.

def solution(board):
    length = len(board)
    if length == 1 :
        return 0 if board[0][0] == 1 else 1
    for row in range(length):
        for col in range(length):
            if board[row][col] == 1:
                rstart, cstart = -1, -1
                rend, cend = 2, 2
                # 제일 마지막인 경우
                if row == 0: rstart = 0
                elif row == length-1: rend = 1
                if col == 0: cstart = 0
                elif col == length -1: cend = 1
                
                for i in range(rstart, rend):
                    for j in range(cstart, cend):
                        if i == 0 and j == 0: continue
                        if board[row+i][col+j] == 1:continue
                        board[row+i][col+j] = 2                        

    answer = [j for i in board for j in i]
    return answer.count(0)
728x90
반응형

댓글