프로그래머스 - 거리두기 확인하기 - Java

chaemin·2024년 3월 6일
0

프로그래머스

목록 보기
4/64

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/81302

2. 풀이

맨해튼 거리
: 두 테이블 T1, T2가 행렬 (r1, c1), (r2, c2)에 각각 위치하고 있다면, T1, T2 사이의 맨해튼 거리는 |r1 - r2| + |c1 - c2| 입니다

  1. 이중for문을 돌면서 P일때만 함수를 돌며 체크한다.
    public boolean isDistanced(char[][] room){
        
        for(int i = 0; i < room.length; i++){
            for(int j = 0; j < 5; j++){
                if(room[i][j] != 'P')
                    continue;
                if(!checkRoom(i, j, room))
                    return false;
            }
        }
        return true;
    }
  1. P의 위치에서 4방향(상하좌우)로 돌면서

2-1. 가고자 하는 좌표의 값이 P이면 (room[goX][goY] == 'P')이면 맨해튼 거리 1이기 때문에 바로 false 반환.

2-2. room[goX][goY] == 'O'라면 맨해튼 거리 2를 파악하기 위해 isNextP 함수로 한번 더 체크한다.

public boolean checkRoom(int x, int y, char[][] room){
        
        for(int i = 0; i < 4; i++){
            int goX = x + moveX[i];
            int goY = y + moveY[i];
            
            if(goX < 0 || goY < 0 || goX >= 5 || goY >= 5 || room[goX][goY] == 'X')
                continue;
            
            if(room[goX][goY] == 'P')
                return false;
            
            else if(room[goX][goY] == 'O'){
                if(isNextP(goX, goY, x, y, room)){
                    return false;
                }
            }
        }
        return true;
    }

2-3. 이때 자신의 원래 좌표(P가 있던) 는 탐색을 하지 않아도 되기 때문에 if((goX == px && goY == py)) continue;

public boolean isNextP(int x, int y, int px, int py, char[][] room){
        
        for(int i = 0; i < 4; i++){
            int goX = x + moveX[i];
            int goY = y + moveY[i];
            
            if(goX < 0 || goY < 0 || goX >= 5 || goY >= 5 || (goX == px && goY == py))
                continue;
            
            if(room[goX][goY] == 'P')
                return true;
        }
        return false;
    }

3. 코드

import java.util.*;

class Solution {
    public static int[] moveX = {1, -1, 0, 0};
    public static int[] moveY = {0, 0, 1, -1};
    
    public int[] solution(String[][] places) {
        int[] result = new int[places.length];
        
        for(int i = 0; i < result.length; i++){
            
            char room[][] = new char[5][5];
            String [] place = places[i];
            
            for(int j = 0; j < 5; j++){
                room[j] = place[j].toCharArray();    
            }
            
            if(isDistanced(room)){
                result[i] = 1;
            } else {
                result[i] = 0;
            }
        }
        return result;
    }
    
    public boolean isDistanced(char[][] room){
        
        for(int i = 0; i < room.length; i++){
            for(int j = 0; j < 5; j++){
                if(room[i][j] != 'P')
                    continue;
                if(!checkRoom(i, j, room))
                    return false;
            }
        }
        return true;
    }
    
    public boolean checkRoom(int x, int y, char[][] room){
        
        for(int i = 0; i < 4; i++){
            int goX = x + moveX[i];
            int goY = y + moveY[i];
            
            if(goX < 0 || goY < 0 || goX >= 5 || goY >= 5 || room[goX][goY] == 'X')
                continue;
            
            if(room[goX][goY] == 'P')
                return false;
            
            else if(room[goX][goY] == 'O'){
                if(isNextP(goX, goY, x, y, room)){
                    return false;
                }
            }
        }
        return true;
    }
    
    public boolean isNextP(int x, int y, int px, int py, char[][] room){
        
        for(int i = 0; i < 4; i++){
            int goX = x + moveX[i];
            int goY = y + moveY[i];
            
            if(goX < 0 || goY < 0 || goX >= 5 || goY >= 5 || (goX == px && goY == py))
                continue;
            
            if(room[goX][goY] == 'P')
                return true;
        }
        return false;
    }
}

0개의 댓글