프로그래머스 | 거리두기 확인하기

문제

 

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

[["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

dr = [-1, 1, 0, 0, -1, 1, -1, 1, -2, 2, 0, 0]
dc = [0, 0, -1, 1, -1, -1, 1, 1, 0, 0, -2, 2]


def solution(places):
    answer = []
    for i in range(5):
        check = 1
        for j in range(5):
            for k in range(5):
                if places[i][j][k] == 'P':
                    for l in range(12):
                        nj = j + dr[l]
                        nk = k + dc[l]
                        if 0<=nj<5 and 0<=nk<5 and places[i][nj][nk] == 'P':
                            if l < 4:
                                check = 0
                                break
                            elif 4 <= l < 8:
                                if places[i][nj][k] == places[i][j][nk] == 'X':
                                    continue
                                else:
                                    check = 0
                                    break
                            elif 8 <= l:
                                if places[i][(nj + j)//2][(nk + k)//2] == 'X':
                                    continue
                                else:
                                    check = 0
                                    break

        answer.append(check)
    return answer

for문이 왜이렇게 많지 ㅠㅠ 이러면서 풀었는데 남들도 다 비슷하게 풀어서 안심..

 

하나씩 돌면서 P가 들어오면

-> 근처에 P가 또 있는지 확인 (근처의 범위: 맨해튼 거리가 2 이하인 거리)

---> 상하좌우에 있다면 0

---> 대각선에 있다면 

-----> 두 P 사이에 X가 두 개 있는지 확인. 없으면 0

---> 한 칸 띄운 상하좌우에 있다면

-----> 그 사이에 X가 있는지 확인. 없으면 0

의 구조로 풀었다!