거리두기 확인하기

Polla·2023년 3월 3일
0

programmers

목록 보기
56/58
post-thumbnail

프로그래머스 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 된 값만 넣어주도록 했다.

오늘의 알고리즘 끝!



profile
트러블 슈팅 Blog => https://polla.palms.blog/home

0개의 댓글