슬기로운슬기

정답 코드 

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를 반환해주는 메서드 

 

반응형
profile

슬기로운슬기

@스를기

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!