# 대기실 5개, 각 대기실 5x5 크기
# |r1 - r2| + |c1 - c2| 2이하로 앉지 않기
# 파티션으로 막혀 있으면 허용
# 각 대기실 별로 거리두기 지키고 있으면 1, 아니면 0 배열에 담아 return
# places 각 행 => 하나의 대기실 구조 P O X 로 구성
# 응시자가 앉아있는자리 => P
# 빈 테이블 => O
# 파티션 => X
# P를 기준으로 맨해튼 거리 2이하인 곳을 모두 물색,
# 물색 시 근처에 P가 나오면 거리두기 지켰는지 검증, 아니면 패스
# 1번 => 근처에 P가 없으므로 패스 따라서 1
# 근처에 P가 있을 시 검증 절차
# x 인덱스 같을 시 y 인덱스 중간지점에 X 있는지 확인
# y 인덱스 같을 시 x 인덱스 중간지점 X 있는지 확인
# 둘다 다를 경우 벽이 두개 있는지 확인, 서로의 index 활용
# [0,3] [1,2] 가 P일 때 [0,2] [1,3] 확인했을 때 둘다 X면 통과 아니면 0 break
# 거리두기 안지킨거 확인되자마자 0 append하고 break
# 1. P를 찾는다
# 2. 근처에 맨해튼 거리 2이하인 P를 찾는다
# 3. 찾았으면 x, y인덱스 비교를 통해 거리두기 지켰나 확인
def menhattan(place, x, y): # 거리두기 안지키고 있는 사람 있는지 체크
# 거리 1일 때
if x + 1 <= 4 and place[x+1][y] == 'P':
return False
if y + 1 <= 4 and place[x][y+1] == 'P':
return False
# 일직선상으로 거리 2일 때
if x + 2 <= 4:
if place[x+2][y] == 'P':
if place[x+1][y] != 'X':
return False
if y + 2 <= 4:
if place[x][y+2] == 'P':
if place[x][y+1] !='X':
return False
# 대각선 상에 있을 때
# 우측 하단
if x + 1 <= 4 and y + 1 <= 4:
if place[x+1][y+1] == 'P':
if place[x+1][y] != 'X' or place[x][y+1] != 'X':
return False
# 좌측 하단
if x + 1 <= 4 and y - 1 >= 0:
if place[x+1][y-1] == 'P':
if place[x][y-1] != 'X' or place[x+1][y] != 'X':
return False
return True
def solution(places):
answer = []
for place in places: # place => 하나의 대기실 정보
status = 1
for i in range(5): # 행의 인덱스 도출
for j in range(5):
if place[i][j] == 'P': # 응시자 발견, 근처 맨해튼 거리 2 응시자 찾기
if menhattan(place, i, j) == True: # 거리두기 수칙 잘 지켰니?
continue
else:
status = 0 # 못지켰을 시 상태 0으로 change
answer.append(0)
break
if status == 0:
break
if status == 1: # 거리두기 수칙 잘 지켜졌으면 1 append
answer.append(1)
return answer
댓글남기기