본문 바로가기
알고리즘 배우기

[프로그래머스] Lv 코테입문. 안전지대

by cwin 2024. 6. 25.

1.  2중 for문을 3번 사용하고, 추가적으로 0 padding을 붙인 (n+2)X(n+2) matrix 메모리를 사용하였다.

def flag (board):
    board_h = len(board)
    board_w = len(board[0])
    height = board_h + 2
    width = board_w + 2
    pos = []
    for row in range(board_h):
        for col in range(board_w) :
            if board[row][col] == 1:
                pos.append([row, col])
            

    # 0 padding으로 채운 리스트 생성
    padding_board = [[0 for _ in range(width)] for _ in range(height)]
    for dot in pos:
        for i in [-1, 0, 1]:
            for j in [-1, 0, 1]:
                padding_board[dot[0]+i + 1][dot[1]+j + 1] = 1
    cnt = 0
    for row in range(1, height-1):
        for col in range(1, width-1):
            if padding_board[row][col] == 0:
                cnt += 1
    return cnt
        

def solution(board):
    answer = flag(board)
    return answer

 

2. 멋진 풀이..

def solution(board):
    n = len(board)
    # set으로 둔 이유는 중복이 알아서 제거된다는 점을 이용하기 위해서
    danger = set()
    # 굳이 range로 각 길이를 지정할 필요가 없었음 --> enumerate() 사용
    for i, row in enumerate(board):
        for j, x in enumerate(row):
        	# not x 의미는 [not 1(폭탄)]이면 실행 X [not True ==> False]
            #              [not 0(안전)]이면 실행 O [not False ==> True]
            if not x:
                continue
            # 현재 [i, j]는 폭탄이 있는 칸 -> 위험지역들을 set에 update하기
            danger.update((i+di, j+dj) for di in [-1,0,1] for dj in [-1, 0, 1])
            
    # 전체 개수 - 위험 지역 개수(단, boundary 확인 -> 문제에서 전체 matrix는 nxn 정사각형이라고 알려줌)
    return n*n - sum(0 <= i < n and 0 <= j < n for i, j in danger)