ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 8.26. 프로그래머스 에서 배우는 파이썬 문법 : if not x:
    TIL( Today I Learned) 2023. 8. 26. 22:52

    8.26

    미니강의 : 프로그래머스 문제 : 안전지대 에서 배운 중요한 것

     

    if not x:

    continue

    update & add 

    sum

     

     

    문제 설명

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

     


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

     

    제한사항

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

     

    입출력 예

    board result
    [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 0, 0]] 16
    [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 1, 0], [0, 0, 0, 0, 0]] 13
    [[1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1]] 0

    입출력 예 설명

    입출력 예 #1

    • (3, 2)에 지뢰가 있으므로 지뢰가 있는 지역과 지뢰와 인접한 위, 아래, 좌, 우, 대각선 총 8칸은 위험지역입니다. 따라서 16을 return합니다.

    입출력 예 #2

    • (3, 2), (3, 3)에 지뢰가 있으므로 지뢰가 있는 지역과 지뢰와 인접한 위, 아래, 좌, 우, 대각선은 위험지역입니다. 따라서 위험지역을 제외한 칸 수 13을 return합니다.

    입출력 예 #3

    • 모든 지역에 지뢰가 있으므로 안전지역은 없습니다. 따라서 0을 return합니다.

     

     

    @ 공부하는 코딩

     

    def solution(board):

        n = len(board) 

        danger = set()  

        for i, row in enumerate(board):

            for j, x in enumerate(row):

                if not x:   # 1 # ,# 4 # ,# 5 # 

                    continue

          

                danger.update((i+di, j+dj) for di in [-1, 0, 1] for dj in [-1, 0, 1]) # 2 # 

            return n*n - sum(0 <= i < n and 0 <= j < n for i, j in danger) # 3# 

     

    @ 주석으로 해설

     

    def solution(board):

        n = len(board)  # 보드의 크기를 저장.

        danger = set()  # 위험 지역의 좌표를 저장할 집합

        for i, row in enumerate(board):

            for j, x in enumerate(row):

                if not x:  # x가 0인 경우(안전한 지역) 건너뜁니다. 해석방법 - 존재하지 않으면, 그래서 false 이면,  0 이면 

                    continue if not x : 가 if x : 보다  효율적인 이유

                # 현재 위치에서 주변 8방향의 좌표를 danger 집합에 추가. Add 와 update의 비교

                danger.update((i+di, j+dj) for di in [-1, 0, 1] for dj in [-1, 0, 1])

        # 전체 보드의 칸 수에서 위험 지역 칸 수를 뺀 값을 반환.

        return n*n - sum(0 <= i < n and 0 <= j < n for i, j in danger) 

    sum의 익숙하지 않은 방법을 요약하면 sum(조건f(x)) 조건 f(x)를 만족하는 것들의 갯수 합

     

     

    @ 자세한 풀이

     

    # 1 # 

     if not x:          # x가 0인 경우(안전한 지역) 건너뜁니다.  

              # 해석방법 - 존재하지 않으면, 그래서 false 이면,  0 이면 

           continue

     

     # 2 # 

             Add 와 update의 비교 add 둘다 집합에서 첨가할 때 , 차이 하나씩은 add, update는 한번에 여러개 가능#

     

    # 3 # 

    sum의 익숙하지 않은 방법을 요약하면 sum(조건f(x)) 조건 f(x)를 만족하는 것들의 갯수 합

     

     

    # 4 # 

    continue 의 쓰임 

    if 조건: continue ; 이면 해당 조건의 block 을 제외하고 계속해~~ 라는 뜻

     

    # 5 # 

        if not x : 가 if x : 보다  효율적인 이유 — 하나만 계산 , 여러개를 계산 차이 

     

     

     

    'TIL( Today I Learned)' 카테고리의 다른 글

    8.29 . 경사하강법  (0) 2023.08.29
    8.28.프로그래머스 문제  (0) 2023.08.29
    8.14.월요일  (0) 2023.08.14
    8.13.일요일  (0) 2023.08.13
    8.12.토요일 잭팟스터디, 문제 풀이 & 미니강의  (1) 2023.08.12
Designed by Tistory.