나의 개발일지

[프로그래머스] Lv.2 거리두기 확인하기 [Python, 파이썬] KAKAO 본문

프로그래머스

[프로그래머스] Lv.2 거리두기 확인하기 [Python, 파이썬] KAKAO

YoonJuHan 2023. 10. 13. 18:04
  • 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/81302
  • 🔑 P 일 때 자기 자리와 상하좌우 자리의 값을 -1 하고 최종적으로 -2 이하인 값이 있는 대기실은 거리두기 실패
    • 파티션의 위치는 큰 값을 주고 -2 아래로 내려가는 일을 없게 한다.
    • -2가 있다는 것은 맨해튼 거리 2 내에 사람이 있다는 의미이다.

 

def makeMap(p):                     # 겹치는 구간 표시 할 5*5 리스트
    newMap = [[0] * 5 for _ in range(5)]
    for i in range(5):
        for j in range(5):
            if p[i][j] == 'X':      # 파티션은 100으로 지정하자
                newMap[i][j] = 100
    return newMap

def solution(places):
    answer = []
    nx, ny = [0, 0, 1, -1], [1, -1, 0, 0]   # 상하좌우
    
    for p in places:                        # 대기실 하나씩 확인
        
        newMap = makeMap(p)                
        
        for i in range(5):
            for j in range(5):
                if p[i][j] == 'P':                      # 응시자 앉아 있으면
                    newMap[i][j] -= 1                   # 자기자리 1내려
                    for n in range(4):                  # 상하좌우 확인 해보자
                        x, y = i+nx[n], j+ny[n]
                        if 0 <= x < 5 and 0 <= y < 5:   # 범위 안 벗어나게
                            newMap[x][y] -= 1           # 상하좌우 자리 1내려
                
        sw = 0
        for i in range(5):
            for j in range(5):
                if newMap[i][j] <= -2:                  # -2보다 작으면
                    sw = 1
                    answer.append(0)                    # 거리두기 실패
                    break
            if sw == 1:
                break
        else:
            answer.append(1)
                                
    return answer
Comments