[Programmers] P81302 거리두기 확인하기

Question

Language: Python

응시자 간에 거리두기 조항을 만족하고 있는 지 여부를 판단하기 위해 각각의 응시자에 대해 맨허튼 거리 2이하의 영역에 대해 응시자가 있는 지 확인하고 있으면 중간에 파티션이 있는 지 여부를 조사한다.

  • 거리가 1인 경우는 무조건 거리두기를 지키지 못하는 상황이다
if place[next_row][next_col]=="P":
    return 0
  • 가로로 거리가 2인 경우에는 중간지점(1개)에 파티션이 있는지 확인한다
if place[next_row][next_col]=="P":
    if place[row+dy//2][col+dx//2] == "X":
        continue
    else:
        return 0
  • 대각선으로 거리가 2인 경우에는 2개의 중간 지점 모든 곳에 파티션이 있는지 확인한다.
if place[next_row][next_col]=="P":
    if place[row][next_col] == "X" and place[next_row][col] == "X":
        continue
    else:
        return 0

Solution

def check_if_true(place):
    first_movements=[(-1,0),(1,0),(0,-1),(0,1)]
    second_movements=[(-2,0),(2,0),(0,-2),(0,2)]
    diagonal_movements=[(-1,-1),(-1,1),(1,-1),(1,1)]
    for row in range(5):
        for col in range(5):
            #현재 자리에 응시자가 있을때
            if place[row][col]=="P":
                #거리 1 조사
                for dy,dx in first_movements:
                    next_row=row+dy
                    next_col=col+dx

                    if next_row <0 or next_row>=5 or next_col<0 or next_col >=5:
                        continue
                    #거리가 1만큼 떨어져있는 곳에 응시자가 있는 경우는 어떠한 경우에도 거리두기가 지켜지지 않는다.
                    if place[next_row][next_col]=="P":
                        return 0
                #거리 2 조사(가로)
                for dy,dx in second_movements:
                    next_row=row+dy
                    next_col=col+dx

                    if next_row <0 or next_row>=5 or next_col<0 or next_col >=5:
                        continue

                    #거리가 2 응시자가 있을 때, 중간에 파티션이 있는 경우 거리두기는 지켜진다.
                    if place[next_row][next_col]=="P":
                        if place[row+dy//2][col+dx//2] == "X":
                            continue
                        else:
                            return 0
                #거리 2 조사(대각선)
                for dy,dx in diagonal_movements:
                    next_row=row+dy
                    next_col=col+dx

                    if next_row <0 or next_row>=5 or next_col<0 or next_col >=5:
                        continue

                    #거리가 2 응시자가 있을 때, 중간에 파티션이 있는 경우 거리두기는 지켜진다.
                    if place[next_row][next_col]=="P":
                        if place[row][next_col] == "X" and place[next_row][col] == "X":
                            continue
                        else:
                            return 0
    return 1
        
    
def solution(places):
    answer=[]

    for place in places:
        answer.append(check_if_true(place))
    
    return answer

댓글남기기