PGMS_거리두기 확인하기 (Java)
[level 2] 거리두기 확인하기 - 81302
성능 요약
메모리: 75.7 MB, 시간: 0.19 ms
구분
코딩테스트 연습 > 2021 카카오 채용연계형 인턴십
채점결과
정확성: 100.0
합계: 100.0 / 100.0
제출 일자
2025년 09월 10일 10:44:45
문제 설명
개발자를 희망하는 죠르디가 카카오에 면접을 보러 왔습니다.
코로나 바이러스 감염 예방을 위해 응시자들은 거리를 둬서 대기를 해야하는데 개발 직군 면접인 만큼
아래와 같은 규칙으로 대기실에 거리를 두고 앉도록 안내하고 있습니다.
- 대기실은 5개이며, 각 대기실은 5x5 크기입니다.
- 거리두기를 위하여 응시자들 끼리는 맨해튼 거리1가 2 이하로 앉지 말아 주세요.
- 단 응시자가 앉아있는 자리 사이가 파티션으로 막혀 있을 경우에는 허용합니다.
예를 들어,
5개의 대기실을 본 죠르디는 각 대기실에서 응시자들이 거리두기를 잘 기키고 있는지 알고 싶어졌습니다. 자리에 앉아있는 응시자들의 정보와 대기실 구조를 대기실별로 담은 2차원 문자열 배열 places가 매개변수로 주어집니다. 각 대기실별로 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 배열에 담아 return 하도록 solution 함수를 완성해 주세요.
제한사항
places의 행 길이(대기실 개수) = 5places의 각 행은 하나의 대기실 구조를 나타냅니다.
places의 열 길이(대기실 세로 길이) = 5places의 원소는P,O,X로 이루어진 문자열입니다.places원소의 길이(대기실 가로 길이) = 5P는 응시자가 앉아있는 자리를 의미합니다.O는 빈 테이블을 의미합니다.X는 파티션을 의미합니다.
- 입력으로 주어지는 5개 대기실의 크기는 모두 5x5 입니다.
- return 값 형식
- 1차원 정수 배열에 5개의 원소를 담아서 return 합니다.
places에 담겨 있는 5개 대기실의 순서대로, 거리두기 준수 여부를 차례대로 배열에 담습니다.- 각 대기실 별로 모든 응시자가 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 담습니다.
입출력 예
| places | result |
|---|---|
[["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] |
입출력 예 설명
입출력 예 #1
첫 번째 대기실
| No. | 0 | 1 | 2 | 3 | 4 |
| 0 | P | O | O | O | P |
| 1 | O | X | X | O | X |
| 2 | O | P | X | P | X |
| 3 | O | O | X | O | X |
| 4 | P | O | X | X | P |
- 모든 응시자가 거리두기를 지키고 있습니다.
두 번째 대기실
| No. | 0 | 1 | 2 | 3 | 4 |
| 0 | P | O | O | P | X |
| 1 | O | X | P | X | P |
| 2 | P | X | X | X | O |
| 3 | O | X | X | X | O |
| 4 | O | O | O | P | P |
- (0, 0) 자리의 응시자와 (2, 0) 자리의 응시자가 거리두기를 지키고 있지 않습니다.
- (1, 2) 자리의 응시자와 (0, 3) 자리의 응시자가 거리두기를 지키고 있지 않습니다.
- (4, 3) 자리의 응시자와 (4, 4) 자리의 응시자가 거리두기를 지키고 있지 않습니다.
세 번째 대기실
| No. | 0 | 1 | 2 | 3 | 4 |
| 0 | P | X | O | P | X |
| 1 | O | X | O | X | P |
| 2 | O | X | P | O | X |
| 3 | O | X | X | O | P |
| 4 | P | X | P | O | X |
- 모든 응시자가 거리두기를 지키고 있습니다.
네 번째 대기실
| No. | 0 | 1 | 2 | 3 | 4 |
| 0 | O | O | O | X | X |
| 1 | X | O | O | O | X |
| 2 | O | O | O | X | X |
| 3 | O | X | O | O | X |
| 4 | O | O | O | O | O |
- 대기실에 응시자가 없으므로 거리두기를 지키고 있습니다.
다섯 번째 대기실
| No. | 0 | 1 | 2 | 3 | 4 |
| 0 | P | X | P | X | P |
| 1 | X | P | X | P | X |
| 2 | P | X | P | X | P |
| 3 | X | P | X | P | X |
| 4 | P | X | P | X | P |
- 모든 응시자가 거리두기를 지키고 있습니다.
두 번째 대기실을 제외한 모든 대기실에서 거리두기가 지켜지고 있으므로, 배열 [1, 0, 1, 1, 1]을 return 합니다.
제한시간 안내
- 정확성 테스트 : 10초
※ 공지 - 2022년 4월 25일 테스트케이스가 추가되었습니다.
-
두 테이블 T1, T2가 행렬 (r1, c1), (r2, c2)에 각각 위치하고 있다면, T1, T2 사이의 맨해튼 거리는 |r1 - r2| + |c1 - c2| 입니다. ↩
출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
문제 풀이
간단한 BFS 문제다.
맨해튼 거리는 공식으로 구하거나 bfs를 통해 진행할 수 있는데 5x5 상황에서 별 차이가 없어 bfs로 구현했다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import java.util.*;
class Solution {
static int[] dr = {-1, 1, 0, 0}, dc = {0, 0, -1, 1};
public int[] solution(String[][] places) {
int[] res = new int[5];
for(int t=0; t<5; t++){
char[][] board = new char[5][5];
for(int i=0; i<5; i++){
board[i] = places[t][i].toCharArray();
}
boolean flag = true;
outer: for(int i=0; i<5; i++){
for(int j=0; j<5; j++){
if(board[i][j] == 'P'){
if(!bfs(board, i, j)) {
flag = false;
break outer;
}
}
}
}
if(flag) res[t] = 1;
else res[t] = 0;
}
return res;
}
private static boolean bfs(char[][] board, int r, int c){
Queue<int[]> queue = new ArrayDeque<>();
boolean[][] visited = new boolean[5][5];
queue.offer(new int[] {r, c});
visited[r][c] = true;
int depth = 0;
while(!queue.isEmpty() && depth < 2){
int size = queue.size();
for(int i=0; i<size; i++){
int[] curr = queue.poll();
int cr = curr[0];
int cc = curr[1];
for(int k=0; k<4; k++){
int nr = cr + dr[k];
int nc = cc + dc[k];
if(isValid(nr, nc) && !visited[nr][nc]){
char node = board[nr][nc];
if(node == 'X') continue;
else if(node == 'P') return false;
else if(node == 'O') {
queue.offer(new int[] {nr, nc});
visited[nr][nc] = true;
}
}
}
}
depth++;
}
return true;
}
private static boolean isValid(int r, int c){
return r >= 0 && r<5 && c >= 0 && c<5;
}
}






