728x90
( 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을 담습니다.
입출력 예시
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초
[코드]
자바
class Solution {
// 상 우 하 좌 이동시길 좌표
int[] dx1 = {0, 1, 0, -1};
int[] dy1 = {-1, 0, 1, 0};
// 오른쪽 위, 오른쪽 아래, 왼쪽 아래, 왼쪽 위 이동시킬 좌표
int[] dx2 = {1, 1, -1, -1};
int[] dy2 = {-1, 1, 1, -1};
public int[] solution(String[][] places) {
int[] answer = new int[places.length];
for(int p = 0; p < places.length; p++) answer[p] = checkPlace(places[p]);
return answer;
}
// 입력받은 x, y가 배열의 범위안에 있는지 판별
public boolean isRange(int x, int y){
return x >= 0 && x < 5 && y >= 0 && y < 5;
}
// 현재 방이 거리두기를 지키면 1 아니면 0을 반환
public int checkPlace(String[] p){
for(int i = 0; i < 5; i++){
for(int j = 0; j < 5; j++){
// 현재 지정한 위치에 사람이 있을 경우
if(p[i].charAt(j) == 'P'){
for(int k = 0; k < 4; k++){
int x = j + dx1[k];
int y = i + dy1[k];
// 범위안에 계산한 상하좌우 x, y값이 있을 경우
if(isRange(x, y)){
// x, y에 사람이 있으면 바로 붙어있음으로 0리턴
if(p[y].charAt(x) == 'P') return 0;
int x1 = x + dx1[k];
int y1 = y + dy1[k];
// 중간에 칸막이가 없는데 다음 칸에 사람이 있으면 0리턴
if(isRange(x1, y1) && p[y].charAt(x) == 'O' && p[y1].charAt(x1) == 'P') return 0;
}
x = j + dx2[k];
y = i + dy2[k];
// 범위안에 계산한 대각선 x, y값이 있으면서 맨하튼 거리를 지키지 못한 경우 0리턴
if(isRange(x, y) && p[y].charAt(x) == 'P' && (p[y].charAt(j) == 'O' || p[i].charAt(x) == 'O')) return 0;
}
}
}
}
return 1; // 위의 케이스를 모두 통과했다면 거리두기를 지켰음으로 1리턴
}
}
코틀린
class Solution {
// 상 우 하 좌 이동시길 좌표
val dx1 = intArrayOf(0, 1, 0, -1)
val dy1 = intArrayOf(-1, 0, 1, 0)
// 오른쪽 위, 오른쪽 아래, 왼쪽 아래, 왼쪽 위 이동시킬 좌표
val dx2 = intArrayOf(1, 1, -1, -1)
val dy2 = intArrayOf(-1, 1, 1, -1)
fun solution(places: Array<Array<String>>) = places.map{ checkPlace(it) }.toIntArray()
// 입력받은 x, y가 배열의 범위안에 있는지 판별
fun isRange(x:Int, y:Int) = x in 0..4 && y in 0..4
// 현재 방이 거리두기를 지키면 1 아니면 0을 반환
fun checkPlace(p:Array<String>):Int{
for(i in 0..4){
for(j in 0..4){
// 현재 지정한 위치에 사람이 있을 경우
if(p[i][j] == 'P'){
for(k in 0..3){
var x = j + dx1[k]
var y = i + dy1[k]
// 범위안에 계산한 상하좌우 x, y값이 있을 경우
if(isRange(x, y)){
// x, y에 사람이 있으면 바로 붙어있음으로 0리턴
if(p[y][x] == 'P') return 0;
val x1 = x + dx1[k];
val y1 = y + dy1[k];
// 중간에 칸막이가 없는데 다음 칸에 사람이 있으면 0리턴
if(isRange(x1, y1) && p[y1][x1] == 'P' && p[y][x] == 'O') return 0
}
x = j + dx2[k];
y = i + dy2[k];
// 범위안에 계산한 대각선 x, y값이 있으면서 맨하튼 거리를 지키지 못한 경우 0리턴
if(isRange(x, y) && p[y][x] == 'P' && ( p[i][x] == 'O' || p[y][j] == 'O' )) return 0
}
}
}
}
return 1 // 위의 케이스를 모두 통과했다면 거리두기를 지켰음으로 1리턴
}
}
제가 잘못 알고 있거나 잘못된 부분이 있을 경우 알려주시고 추가로 궁금한 점 있으신 분들도 댓글이나 메일 주시면 성실히 답변해 드리겠습니다.🧑🏻💻
감사합니다~😄
728x90
'Algorithm > level2' 카테고리의 다른 글
[ 프로그래머스 - Java ] 뉴스 클러스터링 ( 자바 ) (0) | 2021.11.01 |
---|---|
[ 프로그래머스 - Java & Kotlin ] 수식 최대화 ( 자바 & 코틀린 ) (0) | 2021.10.20 |
[ 프로그래머스 - Java & Kotlin ] n^2 배열 자르기 ( 자바 & 코틀린 ) (0) | 2021.10.17 |
[ 프로그래머스 - Java & Kotlin ] 튜플( 자바 & 코틀린 ) (0) | 2021.10.14 |
[ 프로그래머스 - Java & Kotlin ] 9주차_전력망을 둘로 나누기 ( 자바 & 코틀린 ) (0) | 2021.10.13 |