더북(TheBook)

따져야 할 경우의 수가 많고 배열 문제의 특징상 현재 가지고 있는 배열의 크기를 초과하는 인덱스를 가질 수 없으므로 미리 딕셔너리에 정의한 상태를 기반으로 경우의 수를 확인합니다. 맨해튼 거리가 최대 2이므로 자신의 위치보다 최대 2칸 아래에 있는지 확인하는 과정도 거쳐야 합니다. 이러한 과정을 모두 if 문 안에 넣을 수도 있으나 if 문 자체가 매우 커지면 코드의 가독성이 나빠집니다. 하지만 조건문의 특징을 활용하고 싶다면 사용해도 상관은 없습니다. 필요하다면 코드의 가독성 정도는 포기해도 괜찮습니다(대신 이해하기 쉽게 주석을 넣어주세요).

마지막으로 반환된 정답을 리스트로 만들어 제출하면 됩니다.

 

전체 코드

3장/거리두기_확인하기.py

def check(place):
    for idx_row, row in enumerate(place):
        for idx_col, cell in enumerate(row):
            if cell != 'P':
                continue
          
            isNotEndRow = idx_row != 4
            isNotEndCol = idx_col != 4
            isNotFirstCol = idx_col != 0
            isBeforeThirdRow = idx_row < 3
            isBeforeThirdCol = idx_col < 3
          
            #D(Down), D2(2 times Down)
            #R(Right), R2(2 times Right)
            #L(Left)
            #RD(Right - Down), LD(Left - Down)

            if isNotEndRow:
                D = place[idx_row + 1][idx_col]
                if D == 'P': return 0
                if isBeforeThirdRow:
                    D2 = place[idx_row + 2][idx_col]
                    if D2 == 'P' and D != 'X': return 0
                if isNotEndCol:
                    R = place[idx_row][idx_col + 1]
                    RD = place[idx_row + 1][idx_col + 1]
                    if RD == 'P' and (D != 'X' or R != 'X'): return 0
                if isNotFirstCol:
                    L = place[idx_row][idx_col - 1]
                    LD = place[idx_row + 1][idx_col - 1]
                    if LD == 'P' and (D != 'X' or L != 'X'): return 0
            if isNotEndCol:
                R = place[idx_row][idx_col + 1]
                if R == 'P': return 0
                if isBeforeThirdCol:
                    R2 = place[idx_row][idx_col + 2]
                    if R2 == 'P' and R != 'X': return 0
              
    return 1

def solution(places):
    return [check(place) for place in places]
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.