프로그래머스 - 거리두기 확인하기

Computer Science/Problem Solving

문제 설명

제한사항 및 입출력

풀이

왜 이런 문제만 보면 bfs에 사로잡히는건지 모르겠다. 틀에 갇힌 사고가 되어버린 것만 같지만 그래도 가장 먼저 생각한 알고리즘으로 풀이해보기로 했다..

각 응시자의 자리에서 bfs를 돌리면서 맨해튼 거리 내에 사람이 있는지 확인해주었다. while 루프 내에 for문으로 queue의 길이를 재서 각 탐색을 구분하여 맨해튼거리를 쟀다. bfs를 돌릴 때 파티션은 그냥 안가면 올바른 맨해튼 거리를 도출할 수 있다. 이후 한 명이라도 위반했다면 0으로 세팅하고 ans 배열에 넣어주었다.

 

내 코드

from collections import deque

dx = [0, 1, -1, 0]
dy = [1, 0, 0, -1]

def bfs(matrix, sx, sy):
    queue = deque([(sx, sy)])
    visited = set([(sx, sy)])
    
    cnt = 1
    while queue:
        for _ in range(len(queue)):
            x, y = queue.popleft()
            
            for i in range(4):
                nx = x + dx[i]
                ny = y + dy[i]
                
                # 5 * 5 조건
                if 0 <= nx < 5 and 0 <= ny < 5:
                    # 파티션이 아니고 방문한 적 없으면 탐색
                    if matrix[nx][ny] != 'X' and (nx, ny) not in visited:
                        # 맨해튼 거리 2 내로 사람이 있으면 false 반환
                        if matrix[nx][ny] == 'P' and cnt <= 2:
                            return False
                        visited.add((nx, ny))
                        queue.append((nx, ny))
        
        cnt += 1
        if cnt > 2:
            return True

def solution(places):
    ans = []
    
    # 모든 대기실의 모든 사람을 시작점으로 bfs 돌리기
    for place in places:
        flag = 1
        for j in range(5):
            for k in range(5):
                if place[j][k] == 'P':
                    # 한 명이라도 안 지켜졌으면 break 후 0으로 세팅
                    if bfs(place, j, k) == 0:
                        flag = 0
                        break
        
            if not flag:
                break
        
        # 모두 지켜졌으면 1
        ans.append(flag)
        
    return ans

 

풀이에 대한 별다른 특이점은 없기 때문에 시간 복잡도만 설명해보자면, 대기실의 수, 격자의 행열이 모두 5로 고정되어있기 때문에 O(5 * 5 * 5 * 25 * 4)정도 일 것 같다. (25는 모든 사람이 꽉 차있다고 가정할때)

고찰

풀이하고 나니 그냥 각 참석자들을 기준으로 맨해튼 거리를 계산하는 방법이 더 쉬울 것 같아서 풀이해보았다.

 

# 맨해튼 거리 2까지 직접 확인 
def check_place(place):
    for i in range(5):
        for j in range(5):
            if place[i][j] != 'P':
                continue

            # 거리 1 (상하좌우)
            for di, dj in [(1, 0), (-1, 0), (0, 1), (0, -1)]:
                ni, nj = i + di, j + dj
                if 0 <= ni < 5 and 0 <= nj < 5 and place[ni][nj] == 'P':
                    return 0

            # 거리 2 (직선)
            for di, dj in [(2, 0), (-2, 0), (0, 2), (0, -2)]:
                ni, nj = i + di, j + dj
                mi, mj = i + di // 2, j + dj // 2  # 중간 칸
                if 0 <= ni < 5 and 0 <= nj < 5:
                    if place[ni][nj] == 'P' and place[mi][mj] == 'O':
                        return 0

            # 거리 2 (대각선)
            for di, dj in [(1, 1), (1, -1), (-1, 1), (-1, -1)]:
                ni, nj = i + di, j + dj
                if 0 <= ni < 5 and 0 <= nj < 5 and place[ni][nj] == 'P':
                    # 대각선일 때 두 중간 칸 중 하나라도 O면 파티션이 없는 판정
                    if place[i][nj] == 'O' or place[ni][j] == 'O':
                        return 0

    return 1

def solution(places):
    return [check_place(place) for place in places]

굳이 bfs까지는 필요없었던 것 같다..! 시간 복잡도도 bfs에서는 한 번 더 깊게 탐색해야하는 경우도 줄어들어 조금 더 최적화 된 것 같다.

'Computer Science > Problem Solving' 카테고리의 다른 글

프로그래머스 - 디스크 컨트롤러  (0) 2025.11.20
프로그래머스 - [1차] 캐시 (2018 KAKAO BLIND)  (0) 2025.11.19
프로그래머스 - 조이스틱  (0) 2025.11.17
프로그래머스 - 메뉴 리뉴얼  (0) 2025.11.16
프로그래머스 - 서버 증설 횟수  (0) 2025.11.15
'Computer Science/Problem Solving' 카테고리의 다른 글
  • 프로그래머스 - 디스크 컨트롤러
  • 프로그래머스 - [1차] 캐시 (2018 KAKAO BLIND)
  • 프로그래머스 - 조이스틱
  • 프로그래머스 - 메뉴 리뉴얼
hojoo
hojoo
그냥 개발이 즐거운 사람
  • hojoo
    dev_record
    hojoo
  • 전체
    오늘
    어제
    • 분류 전체보기 (84)
      • Study (0)
        • 모든 개발자를 위한 HTTP 웹 기본 지식 (0)
        • Real MySQL 8.0 (0)
        • 친절한 SQL 튜닝 (0)
        • 도메인 주도 개발 시작하기 (0)
        • 대규모 시스템 설계 기초 (0)
      • Computer Science (68)
        • Problem Solving (30)
        • Data Structure (4)
        • Spring Boot (14)
        • DB (1)
        • Java (4)
        • OS (3)
        • Server (3)
        • Tech (0)
      • Security (16)
        • Reversing (15)
        • Assembly (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    PE header
    백준
    DP
    13265
    리버싱
    19622
    Lena tutorial
    Header
    15973
    n^2 배열 자르기
    리버싱 핵심원리
    레나 튜토리얼
    DB
    servlet
    16946
    Reversing
    Spring boot
    x64dbg
    12033
    서버 증설 횟수
    HTTP
    소수상근수
    프로그래머스
    dreamhack.io
    n+1
    9421
    2539
    bean
    21278
    자료구조
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
hojoo
프로그래머스 - 거리두기 확인하기
상단으로

티스토리툴바