개발자를 희망하는 죠르디가 카카오에 면접을 보러 왔습니다.코로나 바이러스 감염 예방을 위해 응시자들은 거리를 둬서 대기를 해야하는데 개발 직군 면접인 만큼아래와 같은 규칙으로 대기실에 거리를 두고 앉도록 안내하고 있습니다.
대기실은 5개이며, 각 대기실은 5x5 크기입니다.거리두기를 위하여 응시자들 끼리는 맨해튼 거리1가 2 이하로 앉지 말아 주세요.단 응시자가 앉아있는 자리 사이가 파티션으로 막혀 있을 경우에는 허용합니다.
예를 들어,
5개의 대기실을 본 죠르디는 각 대기실에서 응시자들이 거리두기를 잘 기키고 있는지 알고 싶어졌습니다. 자리에 앉아있는 응시자들의 정보와 대기실 구조를 대기실별로 담은 2차원 문자열 배열 places
가 매개변수로 주어집니다. 각 대기실별로 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 배열에 담아 return 하도록 solution 함수를 완성해 주세요.
places
의 행 길이(대기실 개수) = 5places
의 각 행은 하나의 대기실 구조를 나타냅니다.places
의 열 길이(대기실 세로 길이) = 5places
의 원소는 P
,O
,X
로 이루어진 문자열입니다.places
원소의 길이(대기실 가로 길이) = 5P
는 응시자가 앉아있는 자리를 의미합니다.O
는 빈 테이블을 의미합니다.X
는 파티션을 의미합니다.places
에 담겨 있는 5개 대기실의 순서대로, 거리두기 준수 여부를 차례대로 배열에 담습니다.places | result |
---|---|
[["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로 잡고 맨해튼 거리 값을 체크하여 걸러낸다.
["POOOP", "OXXOX", "OPXPX", "OOXOX", "POXXP"]
배열에서 값을 돌면서 P
인 값의 위치 값을 start
배열에 저장한다.
BFS
를 구현하기 위한 첫번째 단계이다.
visited
: 방문 여부 체크 (했다면:1, 안했다면:0) 이때 5x5 크기로 초기화한다. 즉 각각의 5개의 대기실에서 각각의 5개의 방에 대한 방문 여부 체크이다. distance
: 맨해튼 거리 체크 (2미만, 2초과 check) distance
배열로 잡아준다. "O"
) , 파티션("X"
)에 대한 처리