정답 코드
public class Solution {
// 이동 방향을 나타내는 배열
private static final int dx[] = {0, -1, 1, 0}; //상, 좌, 우, 하
private static final int dy[] = {-1, 0, 0, 1};
// 자리 옆에 다른 응시자가 있는지 확인하는 메서드 (빈테이블인 경우)
private boolean isNextToVolunteer(char[][] room, int x, int y, int exclude) {
for (int d = 0; d < 4; d++) {
// 해당 방향이 제외된 방향이면 건너뛰기
if (d == exclude) continue;
// 새로운 좌표 계산
int nx = x + dx[d];
int ny = y + dy[d];
// 새로운 좌표가 유효한 범위를 벗어나면 건너뛰기
if (ny < 0 || ny >= room.length || nx < 0 || nx >= room[ny].length)
continue;
// 해당 방향에 응시자가 있다면 true 반환
if (room[ny][nx] == 'P') return true;
}
return false;
}
// 응시자 간의 거리가 적절한지 확인하는 메서드
private boolean isDistanced(char[][] room, int x, int y) {
for (int d = 0; d < 4; d++) {
// 새로운 좌표 계산
int nx = x + dx[d];
int ny = y + dy[d];
// 새로운 좌표가 유효한 범위를 벗어나면 건너뛰기
if (ny < 0 || ny >= room.length || nx < 0 || nx >= room[ny].length)
continue;
switch (room[ny][nx]) {
// 응시자가 있다면 거리가 1이므로 바로 false 반환
case 'P': return false;
// 빈 테이블(O)이 있다면 그 방향으로 응시자가 있는지 확인
case 'O':
if (isNextToVolunteer(room, nx, ny, 3 - d)) return false;
break;
}
}
// 모든 방향에서 확인이 끝나면 true 반환
return true;
}
// 각 방의 상태를 확인하여 거리두기를 잘 지키고 있는지 확인하는 메서드
private boolean isDistanced(char[][] room) {
for (int y = 0; y < room.length; y++) {
for (int x = 0; x < room[y].length; x++) {
// 응시자(P)가 있는 위치인 경우에만 거리두기 확인
if (room[y][x] != 'P') continue;
if (!isDistanced(room, x, y)) return false;
}
}
// 모든 응시자에 대한 거리두기가 확인되면 true 반환
return true;
}
// 주어진 여러 방의 상태에 대해 거리두기를 지켰는지 확인하는 메서드
public int[] solution(String[][] places) {
// 결과를 저장할 배열
int[] answer = new int[places.length];
// 각 방의 상태를 확인하고 결과를 배열에 저장
for (int i = 0; i < answer.length; i++) {
// 문자열로 표현된 방의 상태를 char 배열로 변환
String[] place = places[i];
char[][] room = new char[place.length][];
for (int j = 0; j < room.length; j++) {
room[j] = place[j].toCharArray();
}
// 거리두기가 잘 지켜졌는지 확인하여 결과 배열에 저장
if (isDistanced(room)) {
answer[i] = 1;
} else {
answer[i] = 0;
}
}
// 최종 결과 반환
return answer;
}
}
문제 해설
solution : 메인 메서드
// 주어진 여러 방의 상태에 대해 거리두기를 지켰는지 확인하는 메서드
public int[] solution(String[][] places) {
// 결과를 저장할 배열
int[] answer = new int[places.length];
// 각 방의 상태를 확인하고 결과를 배열에 저장
for (int i = 0; i < answer.length; i++) {
// 문자열로 표현된 방의 상태를 char 배열로 변환
String[] place = places[i];
char[][] room = new char[place.length][];
for (int j = 0; j < room.length; j++) {
room[j] = place[j].toCharArray();
}
// 거리두기가 잘 지켜졌는지 확인하여 결과 배열에 저장
if (isDistanced(room)) {
answer[i] = 1;
} else {
answer[i] = 0;
}
}
// 최종 결과 반환
return answer;
}
- char[][] room : 문자열로 표현된 방을 char 배열로 변경해주기
- isDistanced 메서드를 통해 거리두기를 잘 지켰는지 확인하면 answer 배열에 결과 저장
isDistanced(char[][] room) : 거리두기 확인 메서드 (오버로딩)
private boolean isDistanced(char[][] room) {
for (int y = 0; y < room.length; y++) {
for (int x = 0; x < room[y].length; x++) {
// 응시자(P)가 있는 위치인 경우에만 거리두기 확인
if (room[y][x] != 'P') continue;
if (!isDistanced(room, x, y)) return false;
}
}
// 모든 응시자에 대한 거리두기가 확인되면 true 반환
return true;
}
- 방을 전부 돌면서 문자가 'P'인 경우에만 isDistanced(오버로딩) 메서드 실행
isDistanced(char[][] room, int x, int y) : 거리두기 확인 메서드 (오버로딩)
// 이동 방향을 나타내는 배열
private static final int dx[] = {0, -1, 1, 0}; //상, 좌, 우, 하
private static final int dy[] = {-1, 0, 0, 1};
// 응시자 간의 거리가 적절한지 확인하는 메서드
private boolean isDistanced(char[][] room, int x, int y) {
for (int d = 0; d < 4; d++) {
// 새로운 좌표 계산
int nx = x + dx[d];
int ny = y + dy[d];
// 새로운 좌표가 유효한 범위를 벗어나면 건너뛰기
if (ny < 0 || ny >= room.length || nx < 0 || nx >= room[ny].length)
continue;
switch (room[ny][nx]) {
// 응시자가 있다면 거리가 1이므로 바로 false 반환
case 'P': return false;
// 빈 테이블(O)이 있다면 그 방향으로 응시자가 있는지 확인
case 'O':
if (isNextToVolunteer(room, nx, ny, 3 - d)) return false;
break;
}
}
// 모든 방향에서 확인이 끝나면 true 반환
return true;
}
- 이동방향을 나타내는 배열을 통해서 'P'가 있는지 확인
- 'O'인 경우 : isNextToVolunteer 메서드 실행 : 근처에 응시자가 있는지 확인하는 메서드 (중복된 방향 제거를 위해 3-d를 넣어줌)
- 'X'인 경우 넘어간다. -> 대각선에 있는 부분이 'P'라고 가정해도 근처에 하나만 'X'라면 false로 반환할 것이다.
isNextToVolunteer(char[][] room, int x, int y, int exclude)
// 자리 옆에 다른 응시자가 있는지 확인하는 메서드 (빈테이블인 경우)
private boolean isNextToVolunteer(char[][] room, int x, int y, int exclude) {
for (int d = 0; d < 4; d++) {
// 해당 방향이 제외된 방향이면 건너뛰기
if (d == exclude) continue;
// 새로운 좌표 계산
int nx = x + dx[d];
int ny = y + dy[d];
// 새로운 좌표가 유효한 범위를 벗어나면 건너뛰기
if (ny < 0 || ny >= room.length || nx < 0 || nx >= room[ny].length)
continue;
// 해당 방향에 응시자가 있다면 true 반환
if (room[ny][nx] == 'P') return true;
}
return false;
}
- 자리 옆에 응시자가 있으면 true를 반환해주는 메서드
반응형
'study > 코딩테스트' 카테고리의 다른 글
[프로그래머스][Lv1][Java] 최소직사각형 (0) | 2023.12.27 |
---|---|
[프로그래머스][Lv2][Java] 피로도 (0) | 2023.12.27 |
[알고리즘] DFS(깊이우선탐색)와 BFS(너비우선탐색) (1) | 2023.12.20 |
[프로그래머스][Lv0] 모스부호(1) (0) | 2023.06.12 |
[프로그래머스][LV0] 문자열 여러번 뒤집기 (0) | 2023.06.10 |