본문 바로가기
Programming/Programmers

[프로그래머스] 거리두기 확인하기(Python)

by 데이터현 2021. 10. 31.

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

 

맨해튼 거리 1일 때, 2일 때를 나눠서 생각해보면 쉽게 풀 수 있는 문제였다.

확실히 2단계까지는 주어진 알고리즘으로 구현만 하면 쉽게 풀 수 있는 것 같다.

나의 풀이

def manhattan(i,j,place):
    # 맨허튼 거리 1
    man1 = [(i-1,j),(i+1,j),(i,j+1),(i,j-1)]
    man2_1 = [(i-2,j),(i+2,j),(i,j-2),(i,j+2)]
    man2_2 = [(i-1,j-1),(i-1,j+1),(i+1,j-1),(i+1,j+1)]
    for man in man1:
        x,y = man[0],man[1]
        if 0<= x <=4 and 0<= y <=4:
            if place[x][y] == 'P':
                return False
    # 맨허튼 거리 2-1
    for man in man2_1:
        x,y = man[0],man[1]
        if 0<= x <=4 and 0<= y <=4:
            if place[x][y] == 'P':
                if place[(x+i)//2][(y+j)//2] !='X':
                    return False
    for man in man2_2:
        x,y = man[0],man[1]
        if 0<= x <=4 and 0<= y <=4:
            if place[x][y] == 'P':
                if place[i][y] !='X' or place[x][j] !='X':
                    return False
    return True
def solution(places):
    answer = []
    for num,place in enumerate(places):
        check = True
        for i in range(5):
            for j in range(5):
                if place[i][j] == 'P': # 사람인 경우
                    if not manhattan(i,j,place):
                        check = False
                        break
        if check:
            answer.append(1)
        else:
            answer.append(0)
    return answer

댓글