내용으로 건너뛰기
테페리넷
사용자 도구
등록
로그인
사이트 도구
검색
도구
문서 보기
Fold/unfold all
역링크
미디어 관리자
사이트맵
등록
로그인
>
미디어 관리자
사이트맵
현재 위치:
테페리넷
»
Problem Solving
»
문제
»
프로그래머스
»
거리두기 확인하기
ps:problems:programmers:81302
이 문서는 읽기 전용입니다. 원본을 볼 수는 있지만 바꿀 수는 없습니다. 문제가 있다고 생각하면 관리자에게 문의하세요.
====== 거리두기 확인하기 ====== ===== 풀이 ===== * 그냥 구현문제.. * 모든 셀에 대해서 그 셀에 응시자가 있는 경우, 맨해튼 거리 2 이내의 셀중에 거리두기를 안지킨 응시자가 있는지 확인하면 된다. BFS로 구현할수도 있지만, 그냥 상하좌우로 인접한 셀, 대각선으로 인접한 셀, 상하좌우로 2칸 거리의 셀의 세가지 패턴으로 나누어서 응시자가 있고 파티션이 없는 경우가 있는지를 각각 확인하는 것이 좀더 편리하다. * 만약 문제 조건이 맨해튼거리 3이내였다면 BFS로 하는게 편할것이다.. * 맨해튼 거리 2 이내의 셀의 개수는 상수이므로.. 각 셀에 대해서 거리두기가 지켜지는 지를 찾는것도 O(1)이다. 총 시간복잡도는 O(|셀의 개수|)이지만.. 셀의 개수도 5x5로 고정되어 있으므로 그냥 O(1)이라고 생각해도 되긴 한다. ===== 코드 ===== <dkpr py> """Solution code for "Programmers 81302. 거리두기 확인하기". - Problem link: https://programmers.co.kr/learn/courses/30/lessons/81302 - Solution link: http://www.teferi.net/ps/problems/programmers/81302 """ DELTA = ((1, 0), (0, 1), (-1, 0), (0, -1)) def is_okay(place): def is_person_at_pos(r, c): return 0 <= r < 5 and 0 <= c < 5 and place[r][c] == 'P' for r in range(5): for c in range(5): if not is_person_at_pos(r, c): continue for (dr1, dc1), (dr2, dc2) in zip(DELTA, DELTA[1:] + DELTA[:1]): nr, nc = r + dr1, c + dc1 nnr, nnc = r + dr1 + dr1, c + dc1 + dc1 nr2, nc2 = r + dr2, c + dc2 diag_r, diag_c = r + dr1 + dr2, c + dc1 + dc2 if is_person_at_pos(nr, nc): return False if is_person_at_pos(nnr, nnc) and place[nr][nc] != 'X': return False if (is_person_at_pos(diag_r, diag_c) and (place[nr][nc] != 'X' or place[nr2][nc2] != 'X')): return False return True def solution(places): return [1 if is_okay(x) else 0 for x in places] </dkpr> {{tag>프로그래머스 ps:problems:programmers:Level_2}}
ps/problems/programmers/81302.txt
· 마지막으로 수정됨: 2021/07/10 18:11 저자
teferi
문서 도구
문서 보기
역링크
Fold/unfold all
맨 위로