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

수경·2023년 6월 7일
0

problem solving

목록 보기
156/174

프로그래머스 - 안전지대

풀이

  1. board를 순회하면서 1이 있는 경우에 해당 위치와 인근 8개 위치를 set에 저장
    dx, dy로 현재위치 포함 9개의 위치 인덱스를 저장한 후 for문으로 순회하며 저장

  2. set의 길이 = 1의 개수

  3. 반환값 = 0의 개수(안전한 지대의 개수) = board의 크기(n*n) - set의 길이

1이 있는 위치를 찾기위해 이미 이중for문을 돌렸는데 dx,dy때문에 또 for문을 중첩시키는게 부담일 것 같아서 고민했는데 이게 제일 나은 방법같아서 선택했는데 시간초과는 안났다.
다른 사람 코드를 보니까 4중으로 for문을 작성한 사람도 있었다🫢
내 코드랑 로직은 같으나 dx, dy가 3개씩 반복되는 걸 이용해서 dx * dy로 사용했다. (아래 첨부)

아니 근데 이거 레벨 0인데 왜 dx dy가 나오는 것?


코드

  1. 내 코드
def solution(board):
    n = len(board)
    pos = set([])
    
    dx = [-1, -1, -1, 0, 0, 0, 1, 1, 1]
    dy = [1, 0, -1, 1, -1, 0, 1, 0, -1]
    
    for i, row in enumerate(board):
        for j, col in enumerate(row):
            if col == 1:
                for x, y in zip(dx, dy):
                    if 0 <= i + x < n and 0 <= j + y < n: 
                        pos.add((i + x, j + y))
    return n * n - len(pos)
  1. 다른 사람의 4중 for문 코드
def solution(board):
    n = len(board)
    danger = set()
    for i, row in enumerate(board):
        for j, x in enumerate(row):
            if not x:
                continue
            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)
profile
어쩌다보니 tmi뿐인 블로그😎

0개의 댓글