[Programmers] - 거리두기 확인하기 (Level 2)


2021 KAKAO 채용연계형 인턴십
LEVEL : 2
문제링크

places =[["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"]]
def solution(places):
    import numpy as np
    answer = []
    for place in places:

        #응시생 자리 좌표 구하기
        seat = [[i,j] for i in range(5) for j in range(5) if place[i][j] == 'P']

        ans_tmp = 1
        for i in range(len(seat)-1):
            for j in range(i,len(seat)):

                x1, y1 = seat[i][0], seat[i][1]
                x2, y2 = seat[j][0], seat[j][1]

                if abs(x1-x2) + abs(y1-y2) == 1: # 거리 1 이면 무조건 위반
                    ans_tmp = 0
                    break

                elif abs(x1-x2) + abs(y1-y2) == 2: # 거리 2 일때

                    if x1 == x2 or y1 == y2: #직선경로
                        if place[int((x1+x2)/2)][int((y1+y2)/2)] == 'O':
                            ans_tmp = 0
                            break

                    elif x1<x2 and y1<y2: #대각선경로 \
                        if place[x1][y2] == 'O' or place[x2][y1] == 'O':
                            ans_tmp = 0
                            break   

                    else : #대각선경로 /
                        if place[min(x1,x2)][min(y1,y2)] == 'O' or place[max(x1,x2)][max(y1,y2)] == 'O':
                            ans_tmp = 0
                            break

        answer.append(ans_tmp)

    return answer
solution(places)
[1, 0, 1, 1, 1]

Comments