[Java] 거리두기 확인하기

Korangii·2024년 7월 26일

프로그래머스

목록 보기
9/21
post-thumbnail

거리두기 확인


수정된 코드 (정답 코드)

import java.util.*;

class Solution {
    public int[] solution(String[][] places) {
        int n = places.length;
        int[] answer = new int[n];
        
        for (int i = 0; i < n; i++) {
            answer[i] = check(places[i]) ? 1 : 0;
        }
        
        return answer;
    }

    // 모든 사람이 거리두기를 잘 하고 있는지 체크하는 함수
    // 모두 다 잘 지키고 있으면 return true
    // 한 명이라도 잘 안 지키면 return false
    boolean check(String[] place) { 
        for (int r = 0; r < 5; r++) {
            for (int c = 0; c < 5; c++) {
                if (place[r].charAt(c) == 'P') { // 하나씩 접근하기 위한 용도
                    if (!bfs(r, c, place)) return false; // 거리 2 이하에 사람(P)가 있으면 false 반환
                }
            }
        }
        return true;
    }

    boolean bfs(int startRow, int startCol, String[] place) {
        int[] dr = {0, 1, 0, -1};
        int[] dc = {-1, 0, 1, 0};
        boolean[][] visited = new boolean[5][5];
        Queue<int[]> queue = new ArrayDeque<>();
        queue.offer(new int[]{startRow, startCol, 0});
        visited[startRow][startCol] = true;
        
        while (!queue.isEmpty()) {
            int[] cur = queue.poll();
            int r = cur[0];
            int c = cur[1];
            int dist = cur[2];
            
            if (dist > 2) continue; // 거리가 2를 초과하면 계속 진행
            
            if (dist != 0 && place[r].charAt(c) == 'P') { // 현재 거리가 1 이하일 때 P가 있으면 false
                return false;
            }
            
            for (int i = 0; i < 4; i++) {
                int nr = r + dr[i];
                int nc = c + dc[i];
                if (nr >= 0 && nr < 5 && nc >= 0 && nc < 5 && !visited[nr][nc] && place[nr].charAt(nc) != 'X') {
                    visited[nr][nc] = true;
                    queue.offer(new int[]{nr, nc, dist + 1});
                }
            }
        }
        return true;
    }
}

발생한 에러

실행 결과
/Solution.java:8: error: not a statement
if(check(places[i])) answer[i];
^
/Solution.java:31: error: '(' or '[' expected
Queue<int[]> queue = new ArrayDeque;
^
2 errors
테스트 결과 (~˘▾˘)~
1개 중 0개 성공

기존 코드 (에러 발생)

import java.util.*;
class Solution {
    public int[] solution(String[][] places) {
        int n = places.length;
        int[] answer = {};
        
        for(int i = 0; i < n; i++)
             if(check(places[i])) answer[i];
                else answer[i]=0;
        
        return answer;
    }
    // 모든 사람이 거리두기를 잘 하고 있는지 체크하는 함수
    // 모두 다 잘 지키고 있으면 return true
    // 한 명이라도 잘 안 지키면 return false
   boolean check(String[] place) { 
        for(int r = 0; r <5; r++) {
            for(int c = 0; c< 5; c++){
                if(place[r].charAt(c) == 'P') // 하나씩 접근하기 위한 용도
                    System.out.println(r,c);
                    if(!bfs(r,c, place)) return false; // 거리 2 이하에 사람(P)가 없으면 true 반환하고, 있으면 false를 반환하는 함수
                
            }
        }
        return true;
    }
    boolean bfs(int starRow, int startCol, String[] place){
        int[] dr = {0,1,0,-1};
        int[] dc = {-1,0,1,0};
        boolean[][] visited = new boolean[5][5];
        Queue<int[]> queue = new ArrayDeque;
        Queue.offer(new int[]{starRow,starCol,1});
            visit[0][0] = true;
        
        while(!queue.isEmpty()){
            // 방문
            int[] cur = queue.poll();
            int r = cur[0];
            int dist = cur[2];
            
            if(place[r].charAt(c) == 'P') { // P가 없다면 return false
                return false;
            }
            
            // 예약 (거리가 2 이상이면 예약 안함)
            if (dist >= 2) continue;
            
            for(int i =0; i<4; i++) {
                int nr = r + dr[i];
                int nc = c + dc[i];
                if(nr>=0 && nr<n && nc>= 0 && nc< m && place[nr].charAt(nc) != 'X')
                    if(!visited[nr][nc]){
                        queue.offer(new int[]{nr, nc, dist+1});
                        visited[nr][nc] = true;
                    }
            }
        }
        return true;
    }
}

수정한 부분

  1. 배열 초기화: answer 배열을 동적으로 크기를 정해 초기화해야 합니다.
    if 문에서 표현식 수정: if (check(places[i]))
  2. answer[i];는 표현식이 잘못되었으므로 수정해야 합니다.
  3. Queue 생성: Queue<int[]> queue = new ArrayDeque<>();로 수정해야 합니다.
  4. 변수명 오타 수정: queue.offer(new int[]{starRow, starCol, 1});와 같은 변수명을 맞추어야 합니다.
  5. 올바른 좌표 참조: bfs 함수에서 r과 c는 starRow와 startCol로 사용해야 합니다.
  6. 행렬 크기: n과 m은 5로 고정되어 있으므로 상수로 사용할 수 있습니다.
  7. 경계 조건: 배열의 인덱스 범위를 확인하는 조건을 수정해야 합니다.

수정된 부분 요약

  • answer 배열을 크기 n으로 초기화.
  • check 함수에서 배열 인덱스를 적절하게 참조하도록 수정.
  • bfs 함수에서 Queue 객체 생성 시 < > 제네릭 문법 사용.
  • visited 배열을 올바르게 참조하여 배열의 모든 위치를 방문하도록 수정.
  • BFS의 거리 조건을 체크하고 결과를 반환하는 로직 수정.
  • 이 코드는 각 방의 사람 간의 거리 두기 규칙을 검사하고, 거리두기 규칙을 제대로 지키는지 여부를 배열로 반환합니다.
profile
https://honeypeach.tistory.com/ 로 이전했습니다.

0개의 댓글