프로그래머스 | 안전지대 [파이썬 python]

2023. 3. 14. 16:21·Algorithm/프로그래머스
 

프로그래머스

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

programmers.co.kr

 

코드

import numpy as np

def solution(board):
    n = len(board)
    map = [[0]*(len(board)+2) for _ in range(len(board)+2)] # n+2 * n+2 행렬
    map = np.array(map)

    bomb = [] # 지뢰 위치 저장
    for i in range(n):
        for j in range(n):
            if board[i][j] == 1:
                bomb.append((i+1, j+1)) # map 기준 지뢰 위치
                map[i+1][j+1] = 1 # map에서 지뢰 표시
    #print(board)
    #print(map)
    #print(bomb)

    for i,j in bomb: # 지뢰 주변 지역
        map[i+1][j] = 1
        map[i-1][j] = 1
        map[i][j+1] = 1
        map[i][j-1] = 1
        map[i+1][j+1] = 1
        map[i+1][j-1] = 1
        map[i-1][j+1] = 1
        map[i-1][j-1] = 1
    #print(map)
    map = map[1:n+1,1:n+1] # board와 같은 크기로 슬라이싱
    #print(map)
    answer = n*n - np.sum(map) # 전체 칸 수 - 1의 개수(= 1을 다 더한 값)
    return int(answer)

진짜 코딩테스트에 이런 문제가 나오면 절대 이렇게 풀면 안 되겠지만 아직 내 수준은 여기다. BFS에 대해 공부하고 다시 풀어봐야지...

지난 구름 알고리즘에서 비슷한 문제를 풀어봐서 같은 방식으로 해결하였다.

 

n*n 행렬이 있을 때 가장 가장자리에 지뢰가 위치하면 주변 공간이 부족하기 때문에 indexError가 발생한다.

그래서 상하좌우 1열씩 증가시킨 n+2*n+2 행렬 map을 만들고, nd.array 형태로 바꿔주었다.

map은 0으로 가득 채워져 있어 모두 안전지대이다. 

board에서 지뢰가 위치한 위치를 찾아 그 점이 map에서 해당하는 인덱스를 bomb이라는 리스트에 저장해 주었다.

지뢰가 여러 개면 여러 쌍이 bomb에 존재하게 되는 것이다.

 

bomb에 있는 지뢰의 개수만큼 안전지대가 아닌 지뢰지대(지뢰 기준 상하좌우&대각선)를 찾아 1로 바꿔준다.

+1이 아니라 1로 지정하는 이유는 2개 이상의 지뢰에서 겹치는 지대가 있을 경우 각 지뢰별로 +1을 해주게 되면 2 이상의 숫자가 나오기 때문이다.

 

모든 지뢰지대를 체크했으면 map을 다시 원래 board의 크기로 슬라이싱 해준다.

그럼 전체 지대(n*n)에서 지뢰지대(np.sum(map))를 빼면 안전지대의 개수이다.

np.sum(map)을 해주는 이유는 지뢰지대는 모두 1로 표시했으므로 1의 총개수를 구하면 그 값이 바로 지뢰지대의 개수가 되는 것이다. 그렇기 때문에 sum을 해서 1들의 합을 구하는 것이다.

 

프로그래머스에서 바로 answer를 출력하면 (정수-numpy)를 했기 때문에 아래와 같은 에러가 발생한다.

TypeError: Object of type int64 is not JSON serializable

따라서 int 형으로 바꿔서 리턴해주면 문제없이 제출 가능하다.

저작자표시 (새창열림)
'Algorithm/프로그래머스' 카테고리의 다른 글
  • 프로그래머스 | 겹치는 선분의 길이 [파이썬 python]
  • 프로그래머스 | 평행 [파이썬 python]
  • 프로그래머스 | 숨어있는 숫자의 덧셈(2) [파이썬 python]
  • 프로그래머스 | 다항식 더하기 [파이썬 python]
dduniverse
dduniverse
  • dduniverse
    dduniverse
    dduniverse
  • 전체
    오늘
    어제
    • 분류 전체보기 (245)
      • Algorithm (123)
        • 알고리즘 이론 (8)
        • 백준 (19)
        • 프로그래머스 (83)
        • 구름 알고리즘 먼데이 챌린지 (13)
      • 빅데이터분석기사 (10)
        • 통계 (4)
        • 실기 (6)
      • KT에이블스쿨 (26)
      • FrontEnd (11)
        • React (5)
        • 기타 (6)
      • BackEnd (18)
        • Django (15)
        • Spring (3)
      • DS & ML (11)
        • Machine Learning (9)
        • Kaggle (2)
      • TIL (46)
        • python (22)
        • javascript (3)
        • 오류해결 (10)
        • 기타 (10)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 관리
    • 글쓰기
  • 링크

  • 인기 글

  • hELLO· Designed By정상우.v4.10.0
dduniverse
프로그래머스 | 안전지대 [파이썬 python]
상단으로

티스토리툴바