문제출처:
접근법
방의 개수가 5개이고,방의 크기가 5x5로 제한된다.
맨해튼 거리가 2이하이므로 거리가 1,2인 경우로 구분하면 좋을 것 같다.
2-1. 거리가 1인 경우
2-2. 거리가 2인 경우
- 현재 위치가 (row,col) 이라면 확인해야할 경우의 수는
(row+1,col)
(row+2,col)
(row,col+1)
(row,col+2)
(row+1,col-1)
(row+1,col+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