[프로그래머스] 거리두기 확인하기

HL·2022년 4월 22일
0

프로그래머스

목록 보기
37/44

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/81302#fn1

문제 설명

  • 5*5 크기 보드
  • P(사람), O(빈칸), X(벽)
  • 사람끼리 거리 2칸 이내여야함

풀이

  • BFS 진행하면서 visited에 거리를 저장
  • 현재 좌표의 거리가 2보다 작을때 다음 좌표를 검사
  • 다음 좌표의 거리를 증가시킬 때 현재 좌표의 거리보다 1 증가

후기

  • 오랜만에 풀어서 구현하는데 애먹었다
  • 거리를 잘못 저장해서 모두 1로 저장되도록 구현했다

코드

def solution(places):
    answer = []
    
    for p in places:
        if close(p):
            answer.append(0)
        else:
            answer.append(1)
    
    return answer


def close(p):
    for y in range(5):
        for x in range(5):
            if p[y][x] == "P":
                if bfs(y, x, p):
                    return True
    return False

from collections import deque
def bfs(y, x, board):
    
    dy = [0,0,-1,1]
    dx = [1,-1,0,0]
    
    visited = [[0]*5 for _ in range(5)]
    visited[y][x] = 1
    
    q = deque()
    q.append([y,x])
    
    while q:
        cy, cx = q.popleft()
        for d in range(4):
            ny, nx = cy+dy[d], cx+dx[d]
            if 0<=ny<5 and 0<=nx<5:
                if not visited[ny][nx]:
                    if visited[cy][cx] <= 2:
                        if board[ny][nx] == "P":
                            return True
                        if board[ny][nx] == "O":
                            visited[ny][nx] = visited[cy][cx] + 1
                            q.append([ny,nx])
                        if board[ny][nx] == "X":
                            pass
                    else:
                        pass

    return False
profile
Swift, iOS 앱 개발을 공부하고 있습니다

0개의 댓글