개발자를 희망하는 죠르디가 카카오에 면접을 보러 왔습니다.
코로나 바이러스 감염 예방을 위해 응시자들은 거리를 둬서 대기를 해야하는데 개발 직군 면접인 만큼
아래와 같은 규칙으로 대기실에 거리를 두고 앉도록 안내하고 있습니다.
5개의 대기실을 본 죠르디는 각 대기실에서 응시자들이 거리두기를 잘 기키고 있는지 알고 싶어졌습니다. 자리에 앉아있는 응시자들의 정보와 대기실 구조를 대기실별로 담은 2차원 문자열 배열 places가 매개변수로 주어집니다. 각 대기실별로 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 배열에 담아 return 하도록 solution 함수를 완성해 주세요.
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]
입출력 예 #1
첫 번째 대기실
No. 0 1 2 3 4
0 P O O O P
1 O X X O X
2 O P X P X
3 O O X O X
4 P O X X P
두 번째 대기실
No. 0 1 2 3 4
0 P O O P X
1 O X P X P
2 P X X X O
3 O X X X O
4 O O O P P
세 번째 대기실
No. 0 1 2 3 4
0 P X O P X
1 O X O X P
2 O X P O X
3 O X X O P
4 P X P O X
네 번째 대기실
No. 0 1 2 3 4
0 O O O X X
1 X O O O X
2 O O O X X
3 O X O O X
4 O O O O O
다섯 번째 대기실
No. 0 1 2 3 4
0 P X P X P
1 X P X P X
2 P X P X P
3 X P X P X
4 P X P X P
두 번째 대기실을 제외한 모든 대기실에서 거리두기가 지켜지고 있으므로, 배열 [1, 0, 1, 1, 1]을 return 합니다.
이번 문제는 BFS 알고리즘을 이용하여 탐색하였다. 처음에는 P인 경우만 큐에 담고 문제에서 주어진 맨해튼 거리 2만큼의 조건을 모두 확인하도록 작성하려고 하였지만 쉽지 않았다. 그래서 다른 패턴을 찾아보았고 O에서 상하좌우에 P가 2개 이상 포함된다면 거리 두기가 지켜지지 않은 것이고, P에서 상하좌우에 P가 하나라도 포함된다면 거리 두기가 지켜지지 않은 것이라는 것을 알 수 있었다. 이 조건을 BFS에 적용시켜 해결하였다.
places[i][j][k]
가 O이거나 P일 경우,(j, k)
를 넣어준다.places[i][y][x]
가 O일 경우,places[i][ny][nx]
가 P일 경우,places[i][y][x]
가 P일 경우,places[i][ny][nx]
가 P일 경우, chk를 False로 갱신하고 반복을 종료한다.import collections
def solution(places):
answer = []
dy=[0, 0, -1, 1]
dx=[1, -1, 0, 0]
for i in range(5):
q=collections.deque()
for j in range(5):
for k in range(5):
if places[i][j][k]=='O' or places[i][j][k]=='P':
q.append((j, k))
chk=True
while q:
y, x=q.popleft()
cnt=0
if places[i][y][x]=='O':
for l in range(4):
ny=y+dy[l]
nx=x+dx[l]
if 0<=ny<5 and 0<=nx<5:
if places[i][ny][nx]=='P':
cnt+=1
if cnt>=2:
chk=False
break
else:
for l in range(4):
ny=y+dy[l]
nx=x+dx[l]
if 0<=ny<5 and 0<=nx<5:
if places[i][ny][nx]=='P':
chk=False
break
if chk:
answer.append(1)
else:
answer.append(0)
return answer