

-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를 사용해 보라는 힌트를 보고 잘 해결할 수 있었습니다.
'알고리즘 문제 > Java' 카테고리의 다른 글
| [프로그래머스/Java] 혼자 놀기의 달인 (0) | 2026.05.15 |
|---|---|
| [프로그래머스/Java] 문자열 압축 (0) | 2026.05.14 |
| [프로그래머스/Java] 두 큐 합 같게 만들기 (0) | 2026.05.12 |
| [프로그래머스/Java] 3 x n 타일링 (0) | 2026.05.11 |
| [프로그래머스/Java] 두 원 사이의 정수 쌍 (0) | 2026.05.10 |