영호

[프로그래머스] 2021카카오 인턴십 LV2 거리두기 확인하기 (Python) 본문

Algorithm/kakao

[프로그래머스] 2021카카오 인턴십 LV2 거리두기 확인하기 (Python)

0h0 2022. 5. 12. 19:43

문제 링크

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

나의 풀이

  1. places를 돌며 'P'인 경우 bfs를 수행한다.
  2. bfs에서 queue에는 [x, y, distance] 형식으로 넣고 처음에 distance는 0으로 설정한다.
    1. 이후 while문을 돌며 pop한 distance에 +1을 해주고, 해당 값이 3이 되면 거리두기 2를 지킨 경우이기 때문에 멈춘다.
    2. 만약 상하좌우 탐색 중 distance가 2 이하인데 'P'를 만나면 거리두기가 지켜지지 않은 경우이다.
  3. bfs탐색 결과 False가 나오면 거리두기를 지키지 않은 것이기 때문에 모든 반복문을 멈추고 false를 리턴한다.
  4. bfs탐색 결과 True면 거리두기를 잘 지킨 경우다.

Code

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

# BFS

from collections import deque

def bfs(row, col, place):
    visited = [[0 for _ in range(5)] for _ in range(5)]

    dx, dy = [0, 0, -1, 1], [1, -1, 0, 0]

    q = deque()
    q.append([row, col, 0])
    visited[row][col] = 1

    while q:
        x, y, dist = q.popleft()

        nd = dist + 1

        if nd >= 3:
            break

        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]

            if 0 <= nx < 5 and 0 <= ny < 5 and visited[nx][ny] == 0:
                visited[nx][ny] = 1

                if dist <= 2 and place[nx][ny] == 'P':
                    return False
                if place[nx][ny] == 'O' and nd == 1:
                    q.append([nx, ny, dist + 1])

    return True


def solution(places):
    answer = []

    for place in places:
        flag = 1

        for i in range(5):
            for j in range(5):
                if place[i][j] == 'P':
                    if not bfs(i, j, place):
                        flag = 0

                if not flag:
                    break

            if not flag:
                break
        answer.append(flag)

    return answer

Git

https://github.com/youngh0/Algorithm/blob/master/kakao/2021_internship/LV2_distance_check.py

Comments