[Programmers] 거리두기 확인하기
Updated:
문제링크
문제 해설
주석 참고.
python 코드
from itertools import combinations
def solution(places):
return [check_dist(p) for p in places] # 모든 반에 대해 반복
def check_dist(place):
p_ind = []
empt_ind = []
for i in range(5):
for j in range(5):
if place[i][j] == "P": # 사람의 위치 정보 저장
p_ind.append([i, j])
elif place[i][j] == "O": # 빈 자리의 위치 정보 저장
empt_ind.append([i, j])
if not p_ind or len(p_ind)==1: # 사람이 없거나 한 명만 있는 경우 무조건 거리 두기 조건 만족.
return 1
comb = list(combinations(p_ind, 2)) # 사람끼리의 모든 조합 구성
for c in comb:
dist = get_dist(c[0], c[1]) # 두 사람의 거리 계산
if dist == 1: # 거리가 1인 경우 거리 두기 위반
return 0
elif dist == 2:
if not check_social_dist(c[0], c[1], empt_ind, place): # 거리가 2인 경우 가림막의 유무 확인 필요.
return 0
return 1
def check_social_dist(p1, p2, empt_ind, place):
for e in empt_ind:
if get_dist(p1, e) == 1 and get_dist(p2, e) == 1: # 두 사람으로 부터 같은 거리(1)에 빈 테이블이 있는 경우 위반.
return False
return True # 거리 두기 만족
def get_dist(s, t):
return abs(s[0]-t[0]) + abs(s[1]-t[1]) # 맨허튼 거리 구하기
다른 풀이
def check(place):
for irow, row in enumerate(place):
for icol, cell in enumerate(row):
if cell != 'P':
continue
if irow != 4 and place[irow + 1][icol] == 'P':
return 0
if icol != 4 and place[irow][icol + 1] == 'P':
return 0
if irow < 3 and place[irow + 2][icol] == 'P' and place[irow + 1][icol] != 'X':
return 0
if icol < 3 and place[irow][icol + 2] == 'P' and place[irow][icol + 1] != 'X':
return 0
if irow != 4 and icol != 4 and place[irow + 1][icol + 1] == 'P' and (place[irow + 1][icol] != 'X' or place[irow][icol + 1] != 'X'):
return 0
if irow != 4 and icol != 0 and place[irow + 1][icol - 1] == 'P' and (place[irow + 1][icol] != 'X' or place[irow][icol - 1] != 'X'):
return 0
return 1
def solution(places):
return [check(place) for place in places]
Leave a comment