https://school.programmers.co.kr/learn/courses/30/lessons/81302?language=python3
def solution(places):
result = [] # 결과를 저장할 리스트
dx = [-1, 1, 0, 0] # 상하좌우 이동을 위한 x좌표 변화량
dy = [0, 0, -1, 1] # 상하좌우 이동을 위한 y좌표 변화량
def f(i, j, cnt):
nonlocal good # 외부 변수 good을 사용하기 위해 nonlocal 선언
if cnt > 2: # 맨해튼 거리가 2를 초과하면 종료
return
if -1 < i < 5 and -1 < j < 5: # 인덱스 범위 체크
if graph[i][j] == 'X': # 파티션이 있는 경우
return
if cnt != 0 and graph[i][j] == 'P': # 응시자와의 거리 확인
good = 0 # 거리두기를 지키지 않으면 good을 0으로 설정
return
graph[i][j] = 'X' # 현재 위치를 파티션으로 마킹 (방문 처리)
for w in range(4): # 상하좌우로 탐색
ni = i + dx[w] # 새로운 x좌표
nj = j + dy[w] # 새로운 y좌표
f(ni, nj, cnt + 1) # 재귀 호출
for case in places: # 각 대기실에 대해 검사
graph = [list(r) for r in case] # 문자열을 리스트로 변환
good = 1 # 초기 상태는 거리두기를 잘 지키고 있다고 가정
for i in range(5): # 대기실의 모든 자리 확인
for j in range(5):
if graph[i][j] == 'P': # 응시자가 앉아 있는 자리 발견
f(i, j, 0) # DFS 시작
result.append(good) # 결과 리스트에 추가
return result # 최종 결과 반환
각 대기실을 순회하면서 응시자의 위치를 찾고,
DFS를 통해 인접한 자리에서 응시자가 있는지를 확인하며
거리두기 규칙을 검증
good 변수를 사용하여
거리두기를 지키고 있는지 여부를 기록합니다.
모든 응시자에 대해 검사한 후 결과를 리스트에 저장
재귀 호출을 사용하여
각 응시자의 위치에서 인접한 좌표로 계속해서 이동
응시자 간의 거리를 계산하기 위해
각 응시자 위치에서 상하좌우로 탐색하며,
맨해튼 거리 제한을 고려