Algorithm/프로그래머스
[프로그래머스] 거리두기 확인하기 - Python
자흐니
2022. 1. 13. 21:27
🤔 문제
https://programmers.co.kr/learn/courses/30/lessons/81302
😀 풀이
해당 문제는 두가지 풀이가 가능할 것 같습니다.
- BFS를 사용하여 응시자들 사이의 최단 거리를 구하고 이 거리가 2 이하인 경우가 있는지 체크해보는 방법
- 거리두기를 하지 않은 사람이 있는지 조건문을 사용해서 체크해보는 방법
두 방식 중 소개할 풀이 코드는 2번 방식을 사용했습니다. 만약 거리두기 제한 조건 거리가 2보다 큰 경우였을 때는 거리두기를 하지 않은 사람이 있는지를 조건문으로 체크하기가 쉽지 않아 1번 방식을 사용했을 것 같습니다. 하지만 거리 제한 조건이 2이면 거리두기를 하지 않은 경우는 아래와 같이 두가지만으로 나뉩니다.
- 응시자들 사이의 거리가 1인 경우
- 응시자들 사이의 거리가 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
반응형