문제링크 🚩
https://school.programmers.co.kr/learn/courses/30/lessons/81302
📕 문제 접근 📕
다음과 같은 조건을 만족해야 한다.
대기실은 5개이며, 각 대기실은 5x5 크기
거리두기를 위하여 응시자들 끼리는 맨해튼 거리1가 2 이하로 앉지 말아야 한다.
단, 응시자가 앉아있는 자리 사이가 파티션으로 막혀 있을 경우에는 허용함
맨해튼 거리 1인 경우와 2인 경우를 분리하여 코드를 구성한다면 보다 쉽게 문제를 해결 할 수 있다.
💻 Code 💻
class Solution {
static final int size = 5;
public int[] solution(String[][] places) {
int[] answer = new int[size];
int i = 0;
for (String[] place : places) {
answer[i++] = distance(place);
}
return answer;
}
private static int distance(String[] place) {
char[][] map = new char[size][size];
for (int i = 0; i < size; i++) {
map[i] = place[i].toCharArray();
}
return isPossible(map) ? 1 : 0;
}
private static boolean isPossible(char[][] map) {
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
if (map[i][j] == 'P') {
if (!distanceManhattan(map, i, j)) {
return false;
}
}
}
}
return true;
}
private static boolean distanceManhattan(char[][] map, int x, int y) {
int[] dx = {-1, 0, 1, 0};
int[] dy = {0, -1, 0, 1};
for (int dir = 0; dir < 4; dir++) {
int nx = x + dx[dir];
int ny = y + dy[dir];
if (isValid(nx, ny) && map[nx][ny] == 'P') {
return false;
}
}
int[][] checkDist2 = {
{-2, 0}, {2, 0}, {0, -2}, {0, 2}, {-1, -1}, {-1, 1}, {1, -1}, {1, 1}
};
for (int[] d : checkDist2) {
int nx = x + d[0];
int ny = y + d[1];
if (isValid(nx, ny) && map[nx][ny] == 'P') {
if (d[0] == 0) {
if (map[x][(y + ny) / 2] != 'X') {
return false;
}
} else if (d[1] == 0) {
if (map[(x + nx) / 2][y] != 'X') {
return false;
}
} else {
if (map[x][ny] != 'X' || map[nx][y] != 'X') {
return false;
}
}
}
}
return true;
}
private static boolean isValid(int x, int y) {
return x >= 0 && x < size && y >= 0 && y < size;
}
}
'JAVA > Algo 풀이' 카테고리의 다른 글
[프로그래머스] 표 편집 - JAVA (1) | 2024.10.03 |
---|---|
[프로그래머스] 경주로 건설 - JAVA (0) | 2024.10.03 |
[프로그래머스] 징검다리 건너기 - JAVA (0) | 2024.10.03 |
[프로그래머스] 보석 쇼핑 - JAVA (2) | 2024.10.03 |
[프로그래머스] 2022 KAKAO BLIND RECRUITMENTk진수에서 소수 개수 구하기 - Java (0) | 2023.11.13 |