[Python3]프로그래머스_거리두기 확인하기

Beanzinu·2022년 6월 12일

코딩테스트

목록 보기
35/42

문제출처:

접근법

  1. 방의 개수가 5개이고,방의 크기가 5x5로 제한된다.

  2. 맨해튼 거리가 2이하이므로 거리가 1,2인 경우로 구분하면 좋을 것 같다.

    2-1. 거리가 1인 경우

    • 현재 위치에서 상,하,좌,우 1칸씩 떨어진 경우

    2-2. 거리가 2인 경우

    • 현재 위치에서 상,하,좌,우 2칸씩 떨어진 경우
    • 현재위치에서 대각선으로 1칸씩 떨어진 경우
  • 만약 루프를 (0,0)에서 부터 시작하여 확인한다면
    현재 위치가 만약 (row,col)이라고 한다면
    (row-1,col) , (row,col-1) , (row-1,col-1) , (row-2,col) ,(row,col-2) 등은 확인 할 필요가 없다.
    한 예로 만약 현재 확인하는 위치가(row-1,col)라면 (row,col)은 현재 위치에서 (row-1) + 1 의 위치에 있기 때문에 이미 거리두기를 확인하기 때문이다.

- 현재 위치가 (row,col) 이라면 확인해야할 경우의 수는
(row+1,col)
(row+2,col)
(row,col+1)
(row,col+2)
(row+1,col-1)
(row+1,col+1)

  1. 현재 위치 (row,col)에 사람이 있다면 위의 6가지 위치에 또 다른 사람이 있는 지 확인한다.
    만약 거리가 2인 경우, 사람과 사람 사이에 가림막 대신 빈 책상이 있는 경우 거리두기가 지켜지지 않았다고 판단하여 정답 배열에 0 추가
    모든 경우의 수를 통과했다면 정답 배열에 1 추가

- 현재 방의 5x5 배열을 함수 매개변수로 전달하여
위의 경우의 수를 확인하고 return을 통해 더 효율적으로 계산해야 할 것 같다.

코드

  • (개선코드)
def solve(arr):
    for i,row in enumerate(arr):
        for j,col in enumerate(row):
            if( arr[i][j] == "P" ):
                # 우측
                if( j+1 < 5 and arr[i][j+1] == "P" ):
                    return 0
                elif( j+2 < 5 and arr[i][j+2] == "P" and arr[i][j+1] == "O" ):
                    return 0
                # 아래
                if( i+1 < 5 and arr[i+1][j] == "P" ):
                    return 0
                elif( i+2 < 5 and arr[i+2][j] == "P" and arr[i+1][j] == "O" ):
                    return 0
                # 대각
                if( i+1 < 5 and j-1 >= 0 and arr[i+1][j-1] == "P" ):
                    if( j-1 >= 0 and arr[i][j-1] == "O" ):
                        return 0
                    elif( i+1 < 5 and arr[i+1][j] == "O" ):
                        return 0
                if( i+1 < 5 and j+1 < 5 and arr[i+1][j+1] == "P" ):
                    if( j+1 < 5 and arr[i][j+1] == "O" ):
                        return 0
                    elif( i+1 < 5 and arr[i+1][j] == "O" ):
                        return 0
    return 1
def solution(places):
    answer = []
    for room in places:
        # 맨해튼 거리 확인 
        answer.append(solve(room))
    return answer
  • 이전코드
def solution(places):
    answer = []
    for room in places:
        arr = []
        for row in room:
            arr.append( list(row) )
        # 맨해튼 거리 확인 
        room_answer = 1
        for i in range(len(arr)):
        	if( not room_answer ): break
            for j in range(len(arr[i])):
                if( not room_answer ): break
                if( arr[i][j] == "P" ):
                    # 우측
                    if( j+1 < 5 and arr[i][j+1] == "P" ):
                        room_answer = 0
                    elif( j+2 < 5 and arr[i][j+2] == "P" ):
                        if( arr[i][j+1] == "O" ):
                            room_answer = 0
                    # 아래
                    if( i+1 < 5 and arr[i+1][j] == "P" ):
                        room_answer = 0
                    elif( i+2 < 5 and arr[i+2][j] == "P" ):
                        if( arr[i+1][j] == "O" ):
                            room_answer = 0
                    # 대각
                    if( i+1 < 5 and j-1 >= 0 and arr[i+1][j-1] == "P" ):
                        if( j-1 >= 0 and arr[i][j-1] == "O" ):
                            room_answer = 0
                        elif( i+1 < 5 and arr[i+1][j] == "O" ):
                            room_answer = 0
                    if( i+1 < 5 and j+1 < 5 and arr[i+1][j+1] == "P" ):
                        if( j+1 < 5 and arr[i][j+1] == "O" ):
                            room_answer = 0
                        elif( i+1 < 5 and arr[i+1][j] == "O" ):
                            room_answer = 0
        answer.append(room_answer)
    return answer
profile
당신을 한 줄로 소개해보세요.

0개의 댓글