거리두기 확인하기

송용진·2025년 4월 8일
0

알고리즘과 자료구조

목록 보기
188/190

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 변수를 사용하여
거리두기를 지키고 있는지 여부를 기록합니다.
모든 응시자에 대해 검사한 후 결과를 리스트에 저장

깊이 우선 탐색 (DFS)

재귀 호출을 사용하여
각 응시자의 위치에서 인접한 좌표로 계속해서 이동

응시자 간의 거리를 계산하기 위해
각 응시자 위치에서 상하좌우로 탐색하며,
맨해튼 거리 제한을 고려

profile
개발자

0개의 댓글