728x90
SMALL
문제 이해
- 5X5 대기실이 5개가 있다.
- 거리두기를 잘지켜지는지 확인해야한다.
- 거리두기는 맨해튼 거리 2이하로 앉지 말아야 한다.
- 응시자가 앉아 있는 자리 사이에 파티션으로 막혀있을 경우 맨해튼 거리 2이하도 허용된다.
- 맨해튼 거리 2이하를 생각하였을때 P좌표에서 상하좌우를 총 2번 이내로 움직였을때 또다른 P가 있다면 맨해튼 거리 2이하다.
- 해당 P1좌표가 갈수 있는 위치는 아래 표와 같다.
- P1좌표를 상하좌우 표시를 하고 P2좌표를 상하좌우 표시하면 중첩되는곳이 있다면 거리두기 실패이다.
- 중첩을 찾아내기 위해 P좌표가 방문한곳은 visit 배열로 관리하였다.
P1 갈 수 있음 | P1 갈 수 있음 | P1 갈 수 있음 | |
P1 갈 수 있음 | P1 || P2 갈수 있음 | P1 갈 수 있음 P2 갈수 있음 | |
P1 갈 수 있음 | P1 갈 수 있음 P2 갈수 있음 | P2 || P1 갈 수 있음 | |
P1 갈 수 있음 |
import java.util.*;
class Solution {
static int[] dx = {-1,0,1,0};
static int[] dy = {0,-1,0,1};
boolean[][] visit;
public int[] solution(String[][] places) {
int[] answer = new int[places.length];
for(int i = 0; i<places.length; i++){
answer[i] = checkPlace(places[i]);
}
return answer;
}
// 거리두기 확인(맨해튼 거리가 2 이하는 응시자 기준 둘러싸고 있는 좌표 1칸씩 총 8칸에 포함되지 않으면 거리로 합격이다.)
public int checkPlace(String[] place){
String[][] result = new String[5][5];
visit = new boolean[5][5];
for(int i = 0; i<5; i++){
String[]temp = place[i].split("");
for(int j = 0; j<5; j++){
result[i][j] = temp[j];
}
}
for(int i = 0; i<5; i++){
for(int j = 0; j<5; j++){
// 응시자 위치 찾기
if("P".equals(result[i][j])){
for(int k = 0; k<4; k++){
int x = i + dx[k];
int y = j + dy[k];
// 좌표범위 벗어나거나 파티션만나면 패스
if(x<0 || x>4 || y<0 || y>4 || "X".equals(result[x][y])){
continue;
}
// 상하좌우 좌표값에 응시자가 있거나 다른 응시자가 방문한 곳이면 0 return
if("P".equals(result[x][y]) || visit[x][y]){
return 0;
}
visit[x][y] = true;
}
}
}
}
return 1;
}
}
728x90
LIST
'자바 > 코딩테스트' 카테고리의 다른 글
[프로그래머스] 행렬 테두리 회전하기 - Java(자바) (0) | 2024.05.27 |
---|---|
[프로그래머스] 두 큐 합 같게 만들기 - Java(자바) (0) | 2024.05.22 |
[프로그래머스] 괄호 변환 -Java(자바) (0) | 2024.05.13 |
[프로그래머스] [1차] 프렌즈4블록 - Java(자바) (1) | 2024.04.26 |
[프로그래머스] 단어 변환 - Java(자바) (1) | 2024.04.12 |