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

dh·2023년 2월 17일
0
post-thumbnail

https://school.programmers.co.kr/learn/courses/30/lessons/81302
맨해튼거리가 2이하인 위치

o o * o o
o * * * o
* * a * *
o * * * o
o o * o o

a를 기준으로 *위치가 맨해튼거리가 2이하인 위치임

a기준 상하좌우 한칸옆에 P가 있으면 무조건 거리두기 위반
a기준 바로 한칸 상하좌우가 빈공간인데 대각선방향이나 두칸거리에 P가 있으면 무조건 거리두기 위반

대각선에 있는데 위반하지 않으려면 벽이 아래처림 두개 있어야함
상하좌우방향으로 2칸옆에도 벽이 하나는 있어야함
o o o o o     
o P X o o
o X a o o
o o o o o
o o o o o

o o P o o     
o o X o o
o o a o o
o o o o o
o o o o o

따라서 아래처럼 바로 상하좌우 한칸 옆에 벽이 없는데 대각선이나 두칸차이에 사람이 있으면 무조건 위반임
o o * o o
o * o * o
* b a b *
o * o * o
o o * o o

b에 벽이 있든 없든 상관없이 a기준 위쪽 *들은 거리두기 위반임
나머지 오른쪽,왼쪽,아래도 똑같이 적용

코드

def solution(places):
    answer = [1] *5
    cross =[(-1,0), (1,0), (0,1), (0,-1)]
    around = [[(-1,1),(-2,0),(-1,-1)], 
              [(1,-1),(2,0),(1,1)],
              [(0,2)],
             [(0,-2)]]

    for i,v in enumerate(places):
        for y in range(5):
            for x in range(5):
                if v[y][x]=='P':
                    for k in range(len(cross)):
                        ny = y +cross[k][0]
                        nx = x +cross[k][1]
                        if 0<=ny<5 and 0<=nx<5:
                            if v[ny][nx]=='P':
                                answer[i]=0
                            if v[ny][nx]=='O':
                                for j in around[k]:
                                    nny= y + j[0]
                                    nnx = x + j[1]
                                    if 0<=nny<5 and 0<=nnx<5:
                                         if v[nny][nnx]=='P':
                                            answer[i]=0
                    
    
    return answer

0개의 댓글