프로그래머스 - 거리두기 확인

dobyming·2023년 3월 17일
0

문제 설명

개발자를 희망하는 죠르디가 카카오에 면접을 보러 왔습니다.코로나 바이러스 감염 예방을 위해 응시자들은 거리를 둬서 대기를 해야하는데 개발 직군 면접인 만큼아래와 같은 규칙으로 대기실에 거리를 두고 앉도록 안내하고 있습니다.

대기실은 5개이며, 각 대기실은 5x5 크기입니다.거리두기를 위하여 응시자들 끼리는 맨해튼 거리1가 2 이하로 앉지 말아 주세요.단 응시자가 앉아있는 자리 사이가 파티션으로 막혀 있을 경우에는 허용합니다.

예를 들어,

5개의 대기실을 본 죠르디는 각 대기실에서 응시자들이 거리두기를 잘 기키고 있는지 알고 싶어졌습니다. 자리에 앉아있는 응시자들의 정보와 대기실 구조를 대기실별로 담은 2차원 문자열 배열 places가 매개변수로 주어집니다. 각 대기실별로 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 배열에 담아 return 하도록 solution 함수를 완성해 주세요.


제한사항

  • places의 행 길이(대기실 개수) = 5
    • places의 각 행은 하나의 대기실 구조를 나타냅니다.
  • places의 열 길이(대기실 세로 길이) = 5
  • places의 원소는 P,O,X로 이루어진 문자열입니다.
    • places 원소의 길이(대기실 가로 길이) = 5
    • P는 응시자가 앉아있는 자리를 의미합니다.
    • O는 빈 테이블을 의미합니다.
    • X는 파티션을 의미합니다.
  • 입력으로 주어지는 5개 대기실의 크기는 모두 5x5 입니다.
  • return 값 형식
    • 1차원 정수 배열에 5개의 원소를 담아서 return 합니다.
    • places에 담겨 있는 5개 대기실의 순서대로, 거리두기 준수 여부를 차례대로 배열에 담습니다.
    • 각 대기실 별로 모든 응시자가 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 담습니다.

입출력 예

placesresult
[["POOOP", "OXXOX", "OPXPX", "OOXOX", "POXXP"], ["POOPX", "OXPXP", "PXXXO", "OXXXO", "OOOPP"], ["PXOPX", "OXOXP", "OXPOX", "OXXOP", "PXPOX"], ["OOOXX", "XOOOX", "OOOXX", "OXOOX", "OOOOO"], ["PXPXP", "XPXPX", "PXPXP", "XPXPX", "PXPXP"]][1, 0, 1, 1, 1]

내 코드

from collections import deque
def bfs(place):
    start = [] # P인 값들의 위치를 잡음 
    
    for i in range(5):
        for j in range(5):
            if place[i][j] == 'P':
                start.append([i,j]) # i번째의 j의 위치에서 발견 
    
    for s in start:
        sQueue = deque([s])
        visited = [[0]*5 for _ in range(5)] # 방문처리 check 
        distance = [[0]*5 for _ in range(5)] # 거리
        visited[s[0]][s[1]] = 1 # 시작점 및 방문처리

        while sQueue: 
            x,y = sQueue.popleft()
            dx = [0,0,-1,1] #좌우
            dy = [-1,1,0,0,] #상하

            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:
                    if place[nx][ny] == 'O':
                        sQueue.append([nx,ny]) # 현재 위치 갱신
                        visited[nx][ny] = 1 # 방문처리
                        distance[nx][ny] = distance[x][y] + 1
                    if place[nx][ny] == 'P' and distance[x][y] <= 1:
                        return 0
    return 1
    
def solution(places):
    answer = []
    for p in places:
        answer.append(bfs(p))                                
    return answer

아이디어

BFS 를 활용하여 시작점을 초기 P로 잡고 맨해튼 거리 값을 체크하여 걸러낸다.

  1. ["POOOP", "OXXOX", "OPXPX", "OOXOX", "POXXP"] 배열에서 값을 돌면서 P 인 값의 위치 값을 start 배열에 저장한다.

  2. BFS 를 구현하기 위한 첫번째 단계이다.

  • visited : 방문 여부 체크 (했다면:1, 안했다면:0) 이때 5x5 크기로 초기화한다. 즉 각각의 5개의 대기실에서 각각의 5개의 방에 대한 방문 여부 체크이다.
  • distance : 맨해튼 거리 체크 (2미만, 2초과 check)
  • 초기값: distance 배열로 잡아준다.
  1. 빈 테이블 ("O") , 파티션("X")에 대한 처리
  • "O": 계속해서 탐색할 수 있다. 방문처리 여부와 거리 계산에 대한 누적이 필요하다.
  • "X": 만약 거리가 2미만이면 그 즉시 멈춘다. 즉 P이면서 거리가 1이하로 처리할 수 있다.

0개의 댓글