320x100
https://school.programmers.co.kr/learn/courses/30/lessons/81302#fn1
모든 'P'점에 대해 탐색을 수행해야 하므로 BFS를 사용했다.
사람의 위치를 person 리스트에 담고, queue = deque([start])를 만들어서 거리두기에 걸리는 케이스를 모두 찾는다.
distance는 실시간으로 start로부터의 거리를 저장하는 리스트이고,
visited는 방문 여부를 저장하는 리스트이다. 한 번 방문한 위치는 다시 가지 않는다.
그래서 테이블 'O'이면 visited를 1로 만들고 distance를 1 증가시키고, deque에 그 점을 push한다.
만일 사람 'P'를 만났는데 거리 제한에 걸렸다면 거리두기를 지키지 않은 것. 0을 반환한다.
queue를 모두 돌고 비었다면 거리 두기에 문제가 없었다는 뜻이다. 1을 반환한다.
from collections import deque
def bfs(place):
person = []
for i in range(5):
for j in range(5):
if place[i][j] == 'P':
person.append((i,j))
dx = [1,-1,0,0]
dy = [0,0,1,-1]
for start in person:
queue = deque([start])
visited = [[0 for _ in range(5)] for _ in range(5)] # 방문 여부 CHECK
distance = [[0 for _ in range(5)] for _ in range(5)] # 실시간 거리를 담는 LIST
visited[start[0]][start[1]] = 1
while queue:
x,y = queue.popleft()
for z in range(4): # 상,하,좌,우 CHECK
nx = x + dx[z]
ny = y + dy[z]
# 배열 내 만족 + 방문 아직 안 한 곳
if nx >= 0 and ny >= 0 and nx < 5 and ny < 5 and visited[nx][ny] == 0:
# Table 'O' : 빈 공간이므로 계속 진행.
if place[nx][ny] == 'O':
queue.append((nx,ny))
visited[nx][ny] = 1
distance[nx][ny] = distance[x][y] + 1
# Person 'P' : 거리가 2 이하면 거리두기 걸린 것. return 0
elif place[nx][ny] == 'P' and distance[x][y] < 2:
return 0
# Partition 'X' : 아예 가지도 못하므로 알아서 처리됨.
# 모든 start에 대해 문제 없으면 거리두기 잘 된것. return 1
return 1
def solution(places):
answer = []
for place in places:
answer.append(bfs(place))
return answer
'코딩테스트' 카테고리의 다른 글
[파이썬] 행렬 테두리 회전하기 - 2021 Dev-Matching: 웹 백엔드 개발자 [CODING TEST #22] (0) | 2022.07.27 |
---|---|
[파이썬] 타겟 넘버 [CODING TEST #21] (0) | 2022.07.27 |
[파이썬] 프렌즈4블록 - 2018 KAKAO BLIND RECRUITMENT [CODING TEST #19] (0) | 2022.07.26 |
[파이썬] 수식 최대화 - 2020 카카오 인턴십 [CODING TEST #18] (0) | 2022.07.26 |
[파이썬] 뉴스 클러스터링 - 2018 KAKAO BLIND RECRUITMENT [CODING TEST #17] (0) | 2022.07.25 |
댓글