본문 바로가기
알고리즘/완전탐색

#54 [파이썬] 프로그래머스 : 거리두기 확인하기

by 채채씨 2022. 6. 1.
728x90
반응형

<문제>

https://programmers.co.kr/learn/courses/30/lessons/81302

 

코딩테스트 연습 - 거리두기 확인하기

[["POOOP", "OXXOX", "OPXPX", "OOXOX", "POXXP"], ["POOPX", "OXPXP", "PXXXO", "OXXXO", "OOOPP"], ["PXOPX", "OXOXP", "OXPOX", "OXXOP", "PXPOX"], ["OOOXX", "XOOOX", "OOOXX", "OXOOX", "OOOOO"], ["PXPXP", "XPXPX", "PXPXP", "XPXPX", "PXPXP"]] [1, 0, 1, 1, 1]

programmers.co.kr

 


 

<코드>

def solution(places):
    answer = []
    for room in places:
        if rules(room):
            answer.append(1)
        else:
            answer.append(0)
    return answer

#상하좌우
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]
#대각
dx_d = [1, 1, -1, -1]
dy_d = [1, -1, -1, 1]
    
def valid(X, Y):
    return (0 <= X <= 4) and (0 <=Y <= 4)

def rules(room):
    #조사가 필요한 자리 탐색
    check = []
    for i in range(5):
        for j in range(5):
            if room[i][j] == 'P':
                check.append([i, j])

    for x, y in check:
        for i in range(4):
            #상하좌우에 P있는 경우 탐색
            X = x + dx[i]
            Y = y + dy[i]
            #상하좌우 건너에 P있으면서 사이에 파티션 없는 경우 탐색
            X1 = x + 2 * dx[i]
            Y1 = y + 2 * dy[i]
            #대각에 P있으면서 사이에 파티션 없는 경우 탐색
            X2 = x + dx_d[i]
            Y2 = y + dy_d[i]
            
            if valid(X, Y) and room[X][Y] == 'P': 
                return False
            if valid(X1, Y1) and room[X1][Y1] == 'P' and room[X][Y] != 'X':
                return False
            if valid(X2, Y2) and room[X2][Y2] == 'P' and (room[X2][y] != 'X' or room[x][Y2] != 'X'):
                return False

    return True

 


 

<NOTE>

  • 가장자리 원소에 대해 상하좌우 및 대각을 확인하기 위해 padding을 해주곤 했는데, 시/공간 복잡도가 증가하므로 상하좌우 및 대각 좌표를 세팅한 후 범위를 x또는 y좌표 중 하나라도 제한 범위를 넘어가면 확인하지 않는 유효 검사(valid)를 넣어줄 것
728x90
반응형

댓글