본문 바로가기
문제 풀이/프로그래머스 (Programmers)

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

by 희조당 2022. 6. 26.
728x90

https://programmers.co.kr/learn/courses/30/lessons/81302?language=python3 

 

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

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


 문제 풀이

BFS로도 풀 수 있지만 크기가 5로 고정되어있어 2중 반복문으로 풀었다.

 

for i in range(5):
        for j in range(5):
            if (place[i][j] == 'P'):
                people.append([i,j])

대기실 전체를 돌아 사람의 위치를 확인해 (x, y) 좌표값으로 새로운 리스트에 넣어준다.

 

for i in range(len(people)-1):
        x1, y1 = people[i]
        for j in range(i+1, len(people)):
            x2, y2 = people[j]
            dist = abs(x1-x2) + abs(y1-y2)
            if dist == 2:
                if x2 == x1:
                    if place[x1][y2-1] == 'O': return 0
                elif y2 == y1:
                    if place[x2-1][y1] == 'O': return 0
                else:
                    if place[x1][y2] == 'O' or place[x2][y1] == 'O': return 0
            elif dist == 1: return 0

1번 사람과 2번 사람의 맨해튼 거리가 2 이하인 경우만 따져주면 되기에 2중 포문으로 풀어주었다.

거리가 2이하일 때 경우에 따라 체크만 해주면 된다.

  case 1 : x좌표가 같은 경우

  case 2: y좌표가 같은 경우

  case 3: x, y 좌표가 다른 경우

그리고 거리가 1이면 무조건 거리두기가 지켜지지 않은 것이므로 함수를 종료하면 된다!

 느낀 점

처음에 생각한 풀이는 대기실을 돌아 사람일 때 주변에 모든 경우를 확인하는 것이었다. 

하지만 너무 경우의 수가 많을 것 같아서 포기.

그 다음 생각해낸 풀이가 이 풀이이다!

머릿속에 풀이는 완벽했는데 자잘한 코드 실수가 계속 생겨나서 틀리고 틀리고를 또 반복했다. 

너무 열이 받았다..

 코드

def check(place):
    people = []
    for i in range(5):
        for j in range(5):
            if (place[i][j] == 'P'):
                people.append([i,j])
                
    for i in range(len(people)-1):
        x1, y1 = people[i]
        for j in range(i+1, len(people)):
            x2, y2 = people[j]
            dist = abs(x1-x2) + abs(y1-y2)
            if dist == 2:
                if x2 == x1:
                    if place[x1][y2-1] == 'O': return 0
                elif y2 == y1:
                    if place[x2-1][y1] == 'O': return 0
                else:
                    if place[x1][y2] == 'O' or place[x2][y1] == 'O': return 0
            elif dist == 1: return 0
    
    return 1

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

댓글