본문 바로가기
알고리즘 문제/Java

[프로그래머스/Java] 거리두기 확인하기

by 현장 2026. 5. 13.

-Code

import java.util.*;

class Solution {
    // 위치 정보를 저장할 객체
    static class PosInfo {
        int row, col, dist;

        public PosInfo(int row, int col, int dist) {
            this.row = row;
            this.col = col;
            this.dist = dist;
        }
    }
    // 이동 방향 셋팅
    static int[] dRow = {-1, 1, 0, 0};
    static int[] dCol = {0, 0, -1, 1};
    // 사이즈 저장할 전역 변수
    static int rowSize;
    static int colSize;
    // visted 전역 변수
    static boolean[][] visited;

    public int[] solution(String[][] places) {
        int[] answer = new int[places.length];
        int idx = 0;
        // 각 대기실 검사
        for (String[] place : places) {
            // 사이즈 셋팅
            rowSize = place.length;
            colSize = place[0].length();
            // 현재 대기실 검사 시작
            answer[idx++] = isSafe(place);
        }
        return answer;
    }

    private int isSafe(String[] place) {
        for (int r = 0; r < rowSize; r++) {
            for (int c = 0; c < colSize; c++) {
                if (place[r].charAt(c) == 'P') {
                    // visited 셋팅
                    visited = new boolean[rowSize][colSize];
                    PosInfo pos = new PosInfo(r, c, 0);
                    if (!checkPos(pos, place)) {
                        return 0;
                    }
                }
            }
        }
        return 1;
    }
    // 해당 위치가 가능한지 확인
    private boolean checkPos(PosInfo startPos, String[] place) {
        // 시작점 셋팅
        visited[startPos.row][startPos.col] = true;
        // 덱 셋팅
        Deque<PosInfo> posDeq = new ArrayDeque<>();
        posDeq.addLast(startPos);
        // 탐색
        while (!posDeq.isEmpty()) {
            PosInfo now = posDeq.pollFirst();
            if (now.dist < 2) {
                for (int i = 0; i < 4; i++) {
                    int nr = now.row + dRow[i];
                    int nc = now.col + dCol[i];

                    if (isMove(nr, nc) && !visited[nr][nc]) {
                        // 파티션인 경우 패스
                        if (place[nr].charAt(nc) == 'X') continue;
                        // 현재 시작점에 사람이 있는데 또 나오면 false
                        if (place[nr].charAt(nc) == 'P') return false;
                        // 가능한 경우 덱에 추가 및 visited 셋팅
                        visited[nr][nc] = true;
                        posDeq.addLast(new PosInfo(nr, nc, now.dist + 1));
                    }
                }
            }
        }
        return true;
    }
    // 이동 가능한지 확인
    private boolean isMove(int row, int col) {
        return (0 <= row && row < rowSize) &&
                (0 <= col && col < colSize);
    }
}

처음에 12개의 위치를 저장해 해결하려 했으나 너무 복잡해지는 거 같아서 다른 방식을 찾아보았습니다.

그 결과 BFS를 할 때 2로 거리를 제한해 두면 되는 것을 너무 어렵게 많은 것을 하드코딩하고 하려고 해서 복잡해지는 거였고, 2로 거리를 제한해 BFS를 사용해 보라는 힌트를 보고 잘 해결할 수 있었습니다.