Problem Solving/Programmers

[Programmers]2021 카카오 채용연계형 인턴십: 거리두기 확인하기(Python)/BFS

이진2 2021. 7. 13. 22:53

https://programmers.co.kr/learn/courses/30/lessons/81302?language=python3 

 

코딩테스트 연습 - 거리두기 확인하기

[["POOOP", "OXXOX", "OPXPX", "OOXOX", "POXXP"], ["POOPX", "OXPXP", "PXXXO", "OXXXO", "OOOPP"], ["PXOPX", "OXOXP", "OXPOX", "OXXOP", "PXPOX"], ["OOOXX", "XOOOX", "OOOXX", "OXOOX", "OOOOO"], ["PXPXP", "XPXPX", "PXPXP", "XPXPX", "PXPXP"]] [1, 0, 1, 1, 1]

programmers.co.kr

오랜만에 풀어본 파이썬 BFS 문제

아직은 C가 편하지만 파이썬은 리스트로 스택 큐 둘다 사용할 수 있어서 편한 것 같기도 ㅎ

모든 응시자(P)에 대해 BFS로 도달할 수 있는 거리 2 이내에 다른 사용자가 있는지 확인해주는 간단한 문제였다

def bfs(p, place):
    dr=[1,0,-1,0]
    dc=[0,1,0,-1]
    visit=[[False for _ in range(5)] for _ in range(5)]

    q=[p]
    visit[p[0]][p[1]]=True

    for _ in range(2):
      size=len(q)
      for _ in range(size):
        cur = q.pop(0)

        for i in range(4):
          nr=cur[0]+dr[i]
          nc=cur[1]+dc[i]

          if nr<0 or nr>=5 or nc<0 or nc>=5 or place[nr][nc]=='X' or visit[nr][nc] :continue
          if place[nr][nc]=='P': 
            return False

          q.append([nr,nc])
          visit[nr][nc]=True
    return True

def solution(places):
    answer = []
    for place in places:
      k=True
      for i in range(5):
        for j in range(5):
          if place[i][j]!='P': continue

          k=k&bfs([i,j], place)
      if k: answer.append(1)
      else: answer.append(0)

    return answer