문제에서 이미 조건들을 다 제시해주었다.
✏️ 조건
(1) 맨해튼 거리가 2이하로 앉지 말아주세요.
(2) 단, 응시자가 앉아있는 자리 사이가 파티션으로 막혀 있을 경우에는 허용한다.
- [프로그래머스 문제집 사진]
✔️ 내가 생각한 경우의 수
현재 P
의 위치를 찾았을 때
P
가 존재한다면 False
P
가 존재할 때, 상하좌우가 O
라면 False
P
가 존재한다면, 해당 상하좌우에(P
가 오른쪽 위에 있다면, 위와 오른쪽) O
가 있는지 확인하며, 있다면 False
이다.
# 상하좌우
x_coordinate = [-1, 0, 1, 0]
y_coordinate = [0, 1, 0, -1]
# 대각선
x_diagonal = [-1, -1, 1, 1]
y_diagonal = [-1, 1, 1, -1]
def check_place(place):
arr = []
for i in range(len(place)):
arr.append(list(map(str, place[i].strip())))
for i in range(5):
for j in range(5):
if arr[i][j] == 'P':
# 상하좌우 확인한다.
for rc in range(4):
next_x = x_coordinate[rc] + i
next_y = y_coordinate[rc] + j
next_next_x = x_coordinate[rc] * 2 + i
next_next_y = y_coordinate[rc] * 2 + j
if 0<= next_x <5 and 0<=next_y <5:
if arr[next_x][next_y] == 'P':
return False
# 만약 상하좌우에 O가 있다면, 한 칸 더 옆에 P가 있는지 확인한다.
if arr[next_x][next_y] == 'O' and 0 <= next_next_x <5 and 0<= next_next_y < 5:
if arr[next_next_x][next_next_y] == 'P':
return False
# 대각선 상하좌우 확인한다.
for rc in range(4):
next_x = x_diagonal[rc] + i
next_y = y_diagonal[rc] + j
if 0<= next_x <5 and 0<=next_y <5 and arr[next_x][next_y] == 'P':
if arr[next_x][j] == 'O':
return False
if arr[i][next_y] == 'O':
return False
return True
def solution(places):
answer = []
for in_place in places:
answer.append(int(check_place(in_place)))
return answer