[거리두기 확인하기] 코딩테스트 연습 > 2021 카카오 채용연계형 인턴십> 거리두기 확인하기
※ 주의 : 문제풀이 방법은 다양합니다. 참고만 해주세요 ※
[문제설명]
개발자를 희망하는 죠르디가 카카오에 면접을 보러 왔습니다.
코로나 바이러스 감염 예방을 위해 응시자들은 거리를 둬서 대기를 해야하는데 개발 직군 면접인 만큼
아래와 같은 규칙으로 대기실에 거리를 두고 앉도록 안내하고 있습니다.
- 대기실은 5개이며, 각 대기실은 5x5 크기입니다.
- 거리두기를 위하여 응시자들 끼리는 맨해튼 거리1가 2 이하로 앉지 말아 주세요.
- 단 응시자가 앉아있는 자리 사이가 파티션으로 막혀 있을 경우에는 허용합니다.
예를 들어,

5개의 대기실을 본 죠르디는 각 대기실에서 응시자들이 거리두기를 잘 기키고 있는지 알고 싶어졌습니다. 자리에 앉아있는 응시자들의 정보와 대기실 구조를 대기실별로 담은 2차원 문자열 배열 places가 매개변수로 주어집니다. 각 대기실별로 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 배열에 담아 return 하도록 solution 함수를 완성해 주세요.
제한사항
- places의 행 길이(대기실 개수) = 5
- places의 각 행은 하나의 대기실 구조를 나타냅니다.
- places의 열 길이(대기실 세로 길이) = 5
- places의 원소는 P,O,X로 이루어진 문자열입니다.
- places 원소의 길이(대기실 가로 길이) = 5
- P는 응시자가 앉아있는 자리를 의미합니다.
- O는 빈 테이블을 의미합니다.
- X는 파티션을 의미합니다.
- 입력으로 주어지는 5개 대기실의 크기는 모두 5x5 입니다.
- return 값 형식
- 1차원 정수 배열에 5개의 원소를 담아서 return 합니다.
- places에 담겨 있는 5개 대기실의 순서대로, 거리두기 준수 여부를 차례대로 배열에 담습니다.
- 각 대기실 별로 모든 응시자가 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 담습니다.
입출력 예

입출력 예 설명
입출력 예 #1
첫 번째 대기실

- 모든 응시자가 거리두기를 지키고 있습니다.
두 번째 대기실

- (0, 0) 자리의 응시자와 (2, 0) 자리의 응시자가 거리두기를 지키고 있지 않습니다.
- (1, 2) 자리의 응시자와 (0, 3) 자리의 응시자가 거리두기를 지키고 있지 않습니다.
- (4, 3) 자리의 응시자와 (4, 4) 자리의 응시자가 거리두기를 지키고 있지 않습니다.
세 번째 대기실

- 모든 응시자가 거리두기를 지키고 있습니다.
네 번째 대기실

- 대기실에 응시자가 없으므로 거리두기를 지키고 있습니다.
다섯 번째 대기실

- 모든 응시자가 거리두기를 지키고 있습니다.
두 번째 대기실을 제외한 모든 대기실에서 거리두기가 지켜지고 있으므로, 배열 [1, 0, 1, 1, 1]을 return 합니다.
제한시간 안내
- 정확성 테스트 : 10초
※ 공지 - 2022년 4월 25일 테스트케이스가 추가되었습니다.
- 두 테이블 T1, T2가 행렬 (r1, c1), (r2, c2)에 각각 위치하고 있다면, T1, T2 사이의 맨해튼 거리는 |r1 - r2| + |c1 - c2| 입니다. ↩
[간단설명]
대기실 별로 거리두기 가능한지 판별하기
[접근방법]
1. P1, P2 사이의 거리두기 가능여부를 확인하는 메소드(checkDistance)를 하나 만든다.
2. 대기실 별로 P의 좌표를 리스트(pList)에 저장한다.
3. pList의 P1, P2의 경우의 수를 모두 탐색한다.
4. 하나라도 false 면 0을 정답에 기록한다.
5. 전부 true면 1을 정답에 기록한다.
6. 정답배열 반환
[주의사항]
- Queue나 Stack을 사용해서, BFS/DFS 탐색으로 푸는 경우도 있으니 다양하게 풀어보자.
[소스공개]
import java.util.*;
class Solution {
public int[] solution(String[][] p) {
// 정답리스트
List<Integer> answer = new ArrayList<>();
// 대기실 개수만큼 반복
for(int i=0;i<p.length;i++){
// 거리두기 가능여부
boolean flag = true;
// P리스트
List<int[]> pList = new ArrayList<>();
// 행
for(int r=0;r<p[i].length;r++){
// 렬
for(int c=0;c<p[i][r].length();c++){
// P면 리스트에 저장
if(p[i][r].charAt(c)=='P'){
pList.add(new int[]{r,c});
}
}
}
// P1,P2의 모든 경우의수 탐색
for(int a=0;a<pList.size();a++){
for(int b=a+1;b<pList.size();b++){
// P1,P2 사이에 거리두기 가능한지 체크
if(!checkDistance(p[i],pList.get(a),pList.get(b))){
flag=false;
break;
}
}
}
// 거리두기 가능하면 1, 불가능하면 0 저장
if(flag) answer.add(1);
else answer.add(0);
}
// 정답 배열 반환
return answer.stream().mapToInt(Integer::intValue).toArray();
}
// P1,P2 사이에 거리두기 가능한지 체크
public boolean checkDistance(String[] p, int[] P1,int[] P2){
int r1 = P1[0];
int c1 = P1[1];
int r2 = P2[0];
int c2 = P2[1];
// 맨허튼 거리 구하기
int num = Math.abs(r1-r2) + Math.abs(c1-c2);
// 맨허튼 거리가 2이하 일때,
if(num<=2){
// 맨허튼 거리가 1이면, 붙어있는 경우(거리두기 불가)
if(num==1) return false;
// 맨허튼 거리가 2이면,
else{
// P1, P2가 같은 행에 있을때, 중간값이 X이면 거리두기 가능, 아니면 불가
if(r1==r2){
int mid = c1+1;
if(c1>c2){
mid = c2+1;
}
if(p[r1].charAt(mid)=='X'){
return true;
}else{
return false;
}
// P1, P2가 같은 열에 있을때, 중간값이 X이면 거리두기 가능, 아니면 불가
}else if(c1==c2){
int mid = r1+1;
if(r1>r2){
mid = r2+1;
}
if(p[mid].charAt(c1)=='X'){
return true;
}else{
return false;
}
// P1, P2가 서로다른 행, 서로다른 열에 있을때, 나머지가 모두 X면 거리두기 가능, 아니면 불가
}else{
if(p[r2].charAt(c1)=='X' && p[r1].charAt(c2)=='X'){
return true;
}else{
return false;
}
}
}
// 맨허튼 거리가 3이상 일때, 거리두기 가능
}else{
return true;
}
}
}
[실행결과]
'코딩 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/JAVA] 코딩테스트 연습 > 연습문제 > 하노이의 탑 (by 다알쥐AI) (1) | 2025.02.16 |
---|---|
[프로그래머스/JAVA] 코딩테스트 연습 > 연습문제 > 가장 큰 정사각형 찾기 (by 다알쥐AI) (0) | 2025.02.15 |
[프로그래머스/JAVA] 코딩테스트 연습 > 연습문제 > 테이블 해시 함수 (by 다알쥐AI) (0) | 2025.02.11 |
[프로그래머스/JAVA] 코딩테스트 연습 > 2021 Dev-Matching: 웹 백엔드 개발자(상반기) > 행렬 테두리 회전하기 (by 다알쥐AI) (0) | 2025.02.10 |
[프로그래머스/JAVA] 코딩테스트 연습 > 2020 KAKAO BLIND RECRUITMENT > 괄호 변환 (by 다알쥐AI) (1) | 2025.01.24 |