728x90
SMALL
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
def solution(places):
directions = [(-1, 0), (1, 0), (0, -1), (0, 1), (-1, -1), (-1, 1), (1, -1), (1, 1)]
def is_safe(place):
for r in range(5):
for c in range(5):
if place[r][c] == 'P':
for dr, dc in directions[:4]:
nr, nc = r + dr, c + dc
if 0 <= nr < 5 and 0 <= nc < 5 and place[nr][nc] == 'P':
return 0
if r+2 < 5 and place[r+1][c] == 'O' and place[r+2][c] == 'P':
return 0
if c+2 < 5 and place[r][c+1] == 'O' and place[r][c+2] == 'P':
return 0
if r-2 >= 0 and place[r-1][c] == 'O' and place[r-2][c] == 'P':
return 0
if c-2 >= 0 and place[r][c-1] == 'O' and place[r][c-2] == 'P':
return 0
for dr, dc in directions[4:]:
nr, nc = r + dr, c + dc
if 0 <= nr < 5 and 0 <= nc < 5 and place[nr][nc] == 'P':
if place[r][nc] != 'X' or place[nr][c] != 'X':
return 0
return 1
return [is_safe(place) for place in places]
- 이번 문제도 이전 문제였던 '리코쳇 로봇'과 같이 기본적인 BFS에서의 변형이 필요했던 문제였습니다.
- 참고로 '2021년 카카오 채용연계형 인턴십' 코딩 테스트에 출제되었던 문제입니다.
왜 이렇게 풀었을까?
- 응시자('P')와 빈 좌석('O'), 파티션('X')의 위치에 따라 조건부적인 이동이 필요했습니다.
- 그에 따라 구현에 있어서 조건문이 많이 사용되었고, 거리두기 위반 여부를 판단하기 위해서 인접한 칸뿐만 아니라 두 칸 떨어진 위치까지도 확인할 필요가 있었습니다.
- 또 문제 요구사항에 따라 파티션('X')을 사이에 두고 앉은 경우에도 거리두기를 지킨 것으로 판정해야하기에 해당 위치에서의 대각선 방향(directions[4:])도 계산해주어야 하는 문제였습니다.
- 난이도면에서는 그리 어렵지 않은 문제였는데, 따질 조건들이 많아 시간이 조금 걸렸던 것 같습니다.
728x90
LIST
'알고리즘 문제 > 프로그래머스 (Level 2)' 카테고리의 다른 글
📗 하노이의 탑 (4) | 2024.11.16 |
---|---|
📗 가장 큰 정사각형 찾기 (2) | 2024.10.11 |
📗 리코쳇 로봇 (0) | 2024.10.02 |
📗 테이블 해시 함수 (1) | 2024.09.27 |
📗 줄 서는 방법 (2) | 2024.09.25 |