✨APS (Algorithm Problem Solving)/프로그래머스

[프로그래머스] LV.0 안전지대 / 파이썬(Python)

Nyan cat 2022. 12. 22. 22:00

 

📜 문제 설명

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

 

 

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

 

제한사항

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

 

입출력 예

🔗 문제 링크

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

 

프로그래머스

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

programmers.co.kr

 

💡 문제 풀이

풀다보니까 코드라인이 길어졌다

간단하게 문제를  풀기 위해서 주어진 배열판에 전체적으로 앞뒤위아래에 0을 하나씩 넣어줘서 안전지대를 만들었다.

그리고 새로운 배열을 하나 만들어서 1에서 길이 - 1만큼만 순회하면서 기존 값이 1이면 무조건 1을 넣고 그게 아닐 경우에는 상하좌우대각선 중에 가장 큰 값을 새로운 배열에 넣어준다.

그 후에 새로운 배열에서 0의 갯수를 세면 안전지대의 갯수를 알 수 있다.

def solution(board):
    answer = 0
    n = len(board)
    
    tmp = [0] * (n + 2)
    board_tmp = []
    
    for i in range(n):
        board[i].insert(0, 0)
        board[i].append(0)
    
    board.insert(0, tmp)
    board.append(tmp)
    
    for i in range(1, n + 1):
        tmp = []
        for j in range(1, n + 1):
            if board[i][j]:
                a = 1
            else:
                a = max(board[i - 1][j], board[i][j - 1], board[i - 1][j - 1], board[i + 1][j], board[i][j + 1], board[i + 1][j + 1], board[i - 1][j + 1], board[i + 1][j - 1])
            tmp.append(a)
        board_tmp.append(tmp)
            
    for i in range(n):
        answer += board_tmp[i].count(0)
    
    return answer
반응형