출처 : 프로그래머스 코딩테스트 연습, https://programmers.co.kr/learn/courses/30/lessons/81302
더보기
풀이
def solution(places):
dx = [1, -1, 0, 0, -1, -1, 1, 1, 2, -2, 0, 0]
dy = [0, 0, 1, -1, -1, 1, -1, 1, 0, 0, 2, -2]
answer = []
for room in range(5):
isOkay = True
for line in range(5):
for seat in range(5):
if places[room][line][seat] == 'P':
for i in range(12):
nx = seat + dx[i]
ny = line + dy[i]
if 0 <= nx < 5 and 0 <= ny < 5:
if i < 4:#빨간 영역에 P가 있으며 Fasle
if places[room][ny][nx] == 'P':
isOkay = False
elif i < 8:#파란 영역에 P가 있으면 그 사이 칸이 모두 X가 아니면 False
if places[room][ny][nx] == 'P':
if places[room][line][nx] != 'X' or places[room][ny][seat] != 'X':
isOkay = False
else:#초록 영역에 P가 있으면 그 사이 칸이 X가 아니면 False
if places[room][ny][nx] == 'P':
mid_ny = int((line + ny) / 2)
mid_nx = int((seat + nx) / 2)
if places[room][mid_ny][mid_nx] != 'X':
isOkay = False
if isOkay:
answer.append(1)
else:
answer.append(0)
return answer
모든 경우의 수를 다 체크하는 풀이이다.
전체 행렬을 돌리면서 P가 나오면 P를 중심으로 색깔로 칠해진 영역을 조사한다.
dy, dx로 for문을 돌리면서 4개씩 묶어서 처음에는 빨간색을, 그 다음엔 파란색을, 그다음에는 초록색을 체크한다.
하나의 방이 끝날 때 마다 isOkay 변수를 체크해서 True면 거리두기를 지켰으므로 1을 아니면 0을 넣는다.
시간 복잡도
-
다른 사람의 풀이를 보면서 알게 된 점
-
고찰
완전 피지컬 문제이다.
뭔가 알고리즘 적으로 도입할만한게 있나 계속 고민해봤는데 없어서 결국 전부 탐색하는 풀이로 갔다.
'알고리즘 > Python' 카테고리의 다른 글
[python] 프로그래머스 - 괄호 회전하기 (0) | 2022.02.28 |
---|---|
[python] 프로그래머스 - N개의 최소공배수 (0) | 2022.02.27 |
[python] 프로그래머스 - 게임 맵 최단 거리 (0) | 2022.02.26 |
[python] 프로그래머스 - 124 나라의 숫자 (0) | 2022.02.21 |
[python] 프로그래머스 - 타겟 넘버 (0) | 2022.02.21 |