Algorithm/프로그래머스

[프로그래머스] 거리두기 확인하기 - Python

자흐니 2022. 1. 13. 21:27

🤔 문제


https://programmers.co.kr/learn/courses/30/lessons/81302

 

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

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

😀 풀이


해당 문제는 두가지 풀이가 가능할 것 같습니다.

  1. BFS를 사용하여 응시자들 사이의 최단 거리를 구하고 이 거리가 2 이하인 경우가 있는지 체크해보는 방법
  2. 거리두기를 하지 않은 사람이 있는지 조건문을 사용해서 체크해보는 방법

두 방식 중 소개할 풀이 코드는 2번 방식을 사용했습니다. 만약 거리두기 제한 조건 거리가 2보다 큰 경우였을 때는 거리두기를 하지 않은 사람이 있는지를 조건문으로 체크하기가 쉽지 않아 1번 방식을 사용했을 것 같습니다. 하지만 거리 제한 조건이 2이면 거리두기를 하지 않은 경우는 아래와 같이 두가지만으로 나뉩니다.

  1. 응시자들 사이의 거리가 1인 경우
  2. 응시자들 사이의 거리가 2인데 두 응시자 간 사이에 파티션이 없는 경우
    • 두 응시자가 세로로 앉은 경우
    • 두 응시자가 가로로 앉은 경우
    • 두 응시자가 대각선으로 앉은 경우(파티션 두 개 필요)

모든 응시자들 쌍에 대해 거리를 위와 같은 조건에 따라 비교해보며 거리두기를 지키지 않은 경우가 있다면 바로 0을 리턴하는 함수 checkDistance를 만들었습니다. 

 

💻 풀이 코드는 아래와 같습니다.

def solution(places):
    answer = []
    for place in places:
        answer.append(checkDistance(place))
    return answer

def checkDistance(place):
    people = []
    # 사람 위치 확인
    for i in range(5):
        for j in range(5):
            if place[i][j] == 'P':
                people.append([i, j])
    # 거리 check
    for i in range(len(people)):
        r1, c1 = people[i]
        for j in range(i + 1, len(people)):
            r2, c2 = people[j]
            distance = abs(r1 - r2) + abs(c1 - c2)
            if distance == 1:
                return 0
            if distance == 2:
                if r1 == r2:
                    if place[r1][c1 + 1] == 'O':
                        return 0
                elif c1 == c2:
                    if place[r1 + 1][c1] == 'O':
                        return 0
                else:
                    if c1 < c2:
                        if not(place[r1][c2] == 'X' and place[r2][c1] == 'X'):
                            return 0
                    else:
                        if not(place[r1][c2] == 'X' and place[r2][c1] == 'X'):
                            return 0
    return 1
반응형