프로그래머스 lv2 거리두기 확인하기 파이썬
자리에 앉아있는 응시자들의 정보와 대기실 구조를 대기실별로 담은 2차원 문자열 배열 places가 매개변수로 주어집니다. 각 대기실별로 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 배열에 담아 return 하도록 solution 함수를 완성해 주세요.
1. BFS 사용하는게 좋을것 같다. 2. 대각선을 생각하기 보다는 'P'옆에 '0'을 확인하고, 그 옆에 'P'일 경우 3. 함수를 따로 만들어서 해당할 경우 return 0으로 끝내는게 runtime이나 짜기 편할 것 같다.
def solution(places):
result = []
dx = [-1,1,0,0]
dy = [0,0,-1,1]
nx,ny,px,py = 0,0,0,0
def bfs(i):
for j in range(5):
for z in range(5):
if places[i][j][z] == 'P': # P를 탐색
for p in range(4):
nx = j + dx[p]
ny = z + dy[p]
if nx < 0 or ny < 0 or nx >= 5 or ny >= 5:
continue # 크기를 벗어나는 경우 패스
if places[i][nx][ny] == 'O': # 0을 발견하는 경우 주위 탐색
for p in range(4):
px = nx + dx[p]
py = ny + dy[p]
if px == j and py == z:
continue
if px < 0 or py < 0 or px >= 5 or py >= 5:
continue
if places[i][px][py] == 'P':
return 0
else:
if places[i][nx][ny] == 'P': # 바로 P발견인 경우 0
return 0
return 1 # P가 없거나, 모두 끝났으나, 문제가 없을경우
for i in range(len(places)): # 주어진 케이스 만큼 돌리기
result.append(bfs(i))
return result
나는 생각했던대로 bfs
로 풀었다.
사실 다른 방식도 있기야 하겠지만, 자료구조도 연습하고, 풀릴거라는 확신도 있어서 그대로 진행했다.
대부분은 주석에 있지만
요즘 주석 쓰는 연습 중이다...협업할때나 팀플을 할때는 중요하니깐..
dx = [-1,1,0,0]
처럼 좌표를 설정했다.
크기를 벗어나는 경우, 이 경우는 5x5
라고 명시를 해줬기 때문에,
0
보다 작은 경우와 5
보다 큰 경우로 설정 해줬다.
처음엔 1, 3, 8, 11 의 테스트 케이스에서 실패가 떠서 당황했지만 생각해보니 'P'
옆의 '0'
의 좌우를 살피는 경우 그 전에 발견했던 'P'
가 다시 나올 수 있어서, if
문으로
if px == j and py == z: continue
로 설정 해줬다.
그리고 케이스가 총 몇개인지 모르니, for i in range(len(places)):
로
return
된 값만 넣어주도록 했다.
오늘의 알고리즘 끝!