자바/코딩테스트

[프로그래머스] 거리두기 확인하기 - Java(자바)

대전집주인 2024. 5. 21. 17:08
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