개발계발
프로그래머스 - 거리두기 확인하기(81302) 본문
문제는 아래 링크 참고
https://school.programmers.co.kr/learn/courses/30/lessons/81302
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
접근 방식
맨해튼 거리 : (r1, c1), (r2, c2)에 위치한 테이블의 맨해튼 거리는 |r1-r2| + |c1-c2|
P : 응시자
O : 빈 테이블
X : 파티션
거리두기 : 응시자 사이에 파티션이 있거나, 맨해튼 거리가 3이상이여야 함
거리두기를 지킬경우 1, 아니면 0을 배열에 담아 반환
메인 함수
1. 입력받은 places의 원소(1차원 배열)하나씩 거리두기 함수에 넘김
2. 거리두기 함수는 1(지킨 경우)혹은 0(안 지킨 경우)을 반환
3. 반환 값을 answer에 append
거리두기 함수
1. 입력받은 place에서 P를 검색
2. 검색한 P의 상,하,좌,우 방향의 P혹은 O를 검색
2-1. P를 찾으면 0을 반환
2-2. O를 찾았다면 다시 한 번 상,하,좌,우 중 온 방향을 제외한 곳의 방향의 P를 검색
2-3. P를 찾으면 0을 반환
3. 위 과정을 모두 통과하면 1반환
풀이코드
def keep_distance(place):
directions = [(1, 0), (0, 1), (-1, 0), (0, -1)]
for x in range(5):
for y in range(5):
if place[x][y] == 'P':
# 바로 옆칸 검사
for dx, dy in directions:
nx, ny = x + dx, y + dy
if 0 <= nx < 5 and 0 <= ny < 5:
if place[nx][ny] == 'P': # 바로 옆에 사람이 있는 경우
return 0
elif place[nx][ny] == 'O': # 빈 테이블이면 다음 칸도 검사
new_directions = [direction for direction in directions if direction != (-dx, -dy)]
for ddx, ddy in new_directions:
nnx, nny = nx + ddx, ny + ddy
if 0 <= nnx < 5 and 0 <= nny < 5:
if place[nnx][nny] == "P":
return 0
#모두 통과시
return 1
def solution(places):
answer = []
for place in places:
answer.append(keep_distance(place))
return answer
주의사항
- 처음에 P를 찾고 상하좌우 검색해서 O를 찾았을 때 다음 방향 검색 시 내가 온 방향은 제외하고 검사해야함
'알고리즘' 카테고리의 다른 글
프로그래머스 - 기사단원의 무기(136798) (0) | 2024.05.16 |
---|---|
프로그래머스 - 행렬의 곱셈(12949) (1) | 2024.05.03 |
프로그래머스 - 삼각달팽이(68645) (2) | 2024.05.01 |
프로그래머스 - 행렬 테두리 회전하기(77485) (1) | 2024.04.30 |
프로그래머스 - 교점에 별 만들기(87377) (1) | 2024.04.26 |