프로그래머스
[프로그래머스] 거리두기 확인하기 with Python
kirr
2023. 6. 15. 17:42
거리두기 확인하기 문제 : 프로그래머스
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🙆🏻♀️ 문제 설명
개발자를 희망하는 죠르디가 카카오에 면접을 보러 왔습니다.
코로나 바이러스 감염 예방을 위해 응시자들은 거리를 둬서 대기를 해야하는데 개발 직군 면접인 만큼
아래와 같은 규칙으로 대기실에 거리를 두고 앉도록 안내하고 있습니다.
- 대기실은 5개이며, 각 대기실은 5x5 크기입니다.
- 거리두기를 위하여 응시자들 끼리는 맨해튼 거리1가 2 이하로 앉지 말아 주세요.
- 단 응시자가 앉아있는 자리 사이가 파티션으로 막혀 있을 경우에는 허용합니다.
예를 들어,

위 그림처럼 자리 사이에 파티션이 존재한다면 맨해튼 거리가 2여도 거리두기를 지킨 것입니다.

위 그림처럼 파티션을 사이에 두고 앉은 경우도 거리두기를 지킨 것입니다.

위 그림처럼 자리 사이가 맨해튼 거리 2이고 사이에 빈 테이블이 있는 경우는 거리두기를 지키지 않은 것입니다.
5개의 대기실을 본 죠르디는 각 대기실에서 응시자들이 거리두기를 잘 기키고 있는지 알고 싶어졌습니다. 자리에 앉아있는 응시자들의 정보와 대기실 구조를 대기실별로 담은 2차원 문자열 배열 places가 매개변수로 주어집니다. 각 대기실별로 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 배열에 담아 return 하도록 solution 함수를 완성해 주세요.
제한사항
- places의 행 길이(대기실 개수) = 5
- places의 각 행은 하나의 대기실 구조를 나타냅니다.
- places의 열 길이(대기실 세로 길이) = 5
- places의 원소는 P,O,X로 이루어진 문자열입니다.
- places 원소의 길이(대기실 가로 길이) = 5
- P는 응시자가 앉아있는 자리를 의미합니다.
- O는 빈 테이블을 의미합니다.
- X는 파티션을 의미합니다.
- 입력으로 주어지는 5개 대기실의 크기는 모두 5x5 입니다.
- return 값 형식
- 1차원 정수 배열에 5개의 원소를 담아서 return 합니다.
- places에 담겨 있는 5개 대기실의 순서대로, 거리두기 준수 여부를 차례대로 배열에 담습니다.
- 각 대기실 별로 모든 응시자가 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 담습니다.
입출력 예

🙆🏻♀️ How to solve
1. result 값으로 1을 리턴하는 경우
- 맨해튼의 거리가 2이상인 경우
- 두 좌표의 차이가 0인 경우(좌표 값이 같은 경우)
2. result 값이 2를 리턴하는 경우
- 두 좌표의 맨해튼 거리가 1인 경우
- 행은 같은데 두 좌표 사이 열에 파티션이 없는 경우
- 열은 같은데 두 좌표 사이 행에 파티션이 없는 경우
- 열/행이 다른경우(대각선), 두 사람 사이 파티션이 없는 경우
💻code
def check_distance(place):
# 'P' 값의 좌표만 plist에 추가.
plist = [(y, x) for y in range(5) for x in range(5) if place[y][x] == 'P']
# 각 좌표끼리 거리를 계산하고, 거리에 따라 거리두기 여부 판단
for y, x in plist:
for y2, x2 in plist:
dist = abs(y-y2) + abs(x-x2) # 맨해튼 거리
if dist == 0 or dist > 2: # 같은 좌표이거나 거리가 2이상인 경우 continue
continue
if dist == 1: # 두 사람 사이의 거리가 1인 경우
return 0
elif y == y2 and place[y][int((x+x2)/2)] != 'X': # 열이 같으나 두 사람 사이에 파티션이 없는 경우
return 0
elif x == x2 and place[int((y+y2)/2)][x] != 'X': # 행이 같으나 두 사람 사이에 파티션이 없는 경우
return 0
elif y != y2 and x != x2: # 열/행이 다른경우(대각선), 두 사람 사이 파티션이 없는 경우
if place[y2][x] != 'X' or place[y][x2] != 'X':
return 0
return 1
def solution(places):
answer = []
# 각 place들을 check_distance함수로 조사
for place in places:
answer.append(check_distance(place))
return answer