[파이썬] 카카오 2021 거리두기 확인하기

Kanto(칸토)·2023년 9월 28일
0

알고리즘 인터뷰

목록 보기
21/30

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

일반적인 BFS에서 한 가지 아이디어가 필요했다.
먼저 사람이 앉아있는 위치를 찾고 visited 배열을 선언한 후에 BFS를 출발한다.
BFS를 수행하기 위해 q가 필요하다.

                if p[i][j] == "P":
                    q.append((i, j))
                    v = [[0] * 5 for _ in range(5)]
                    v[i][j] = 1

만약 거리가 2 이하인 경우 경로상에 X가 없는 경우이면 실패한 경우로 본다.
elif p[y][x] !='X' and p[ny][nx] == "P":
한번이라도 실패하면 더 진행할 필요가 없므로 break 로 종료한다. while문도 함께 중료시키기 위해서 index를 while문 조건에 추가해주었다.
그게 아닌 경우 q에 다음 행선지를 추가하는데, 거리가 2가 넘지 않으면서 O 인 경우만 추가하하면 된다. (X인 경우는 더 이상 진행하지 않는다)

from collections import deque

def solution(places):
    dx = [1, -1, 0, 0]
    dy = [0, 0, 1, -1]
    answer = [True] * 5
    for ind, p in enumerate(places):
        p = [*map(list, p)]
        for i in range(5):
            for j in range(5):
                q = deque()
                if p[i][j] == "P":
                    q.append((i, j))
                    v = [[0] * 5 for _ in range(5)]
                    v[i][j] = 1
                    d = 0
                    while q and answer[ind]:
                        y, x = q.popleft()
                        for t in range(4):
                            ny = y + dy[t]
                            nx = x + dx[t]
                            if (
                                ny >= 5
                                or nx >= 5
                                or ny < 0
                                or nx < 0
                                or v[ny][nx]
                            ):
                                continue
                            elif p[y][x] !='X' and p[ny][nx] == "P":
                                print(f"{(ny,nx)} is too close to {(i,j)} at place {ind}")
                                answer[ind] = False
                                break
                            else:
                                v[ny][nx] == 1
                                if p[ny][nx] == 'O' and abs(ny-i)+abs(nx-j)<2:
                                    q.append((ny, nx))
    return list(map(int,answer))
profile
통계학으로 사람들의 행동을 이해하고 싶습니다.

0개의 댓글

관련 채용 정보