코딩/알고리즘

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

유어노우 2022. 1. 13. 23:00

- 문제

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

 

코딩테스트 연습 - 거리두기 확인하기

[["POOOP", "OXXOX", "OPXPX", "OOXOX", "POXXP"], ["POOPX", "OXPXP", "PXXXO", "OXXXO", "OOOPP"], ["PXOPX", "OXOXP", "OXPOX", "OXXOP", "PXPOX"], ["OOOXX", "XOOOX", "OOOXX", "OXOOX", "OOOOO"], ["PXPXP", "XPXPX", "PXPXP", "XPXPX", "PXPXP"]] [1, 0, 1, 1, 1]

programmers.co.kr

 

- 코드 설명

제대로된 알고리즘을 구현하지 못했습니다. 

 

좌표문제에 특히 약점을 보이는 것 같네요... 다른 분들은 dfs로 많이 푸셨습니다.

class Solution {
    public int[] solution(String[][] places) {
        int[] answer =  new int[places.length];
        for(int i=0; i<places.length; i++){
            String seats = "";
            for(String str : places[i]){
                seats = seats.concat(str);
            }
            if(checkValidate(seats) == true){
                answer[i] = 1;
            }
            else
                answer[i] = 0;
           
        }
        return answer;
    }
    private boolean checkValidate(String seats){
        int i,idx;
        
        for(idx = 0; idx<seats.length(); idx++){
            if(seats.charAt(idx) == 'P'){
                //좌
                if(idx%5 >= 2 ){
                    String temp = seats.substring(idx-2,idx);
                    if(temp.contains("P") && temp.equals("PX") == false)
                        return false;
                }
                //우
                if(idx%5 <= 2){
                  String temp = seats.substring(idx+1,idx+3);
                    if(temp.contains("P") && temp.equals("XP") == false ) 
                        return false;  
                } 
                //상
                if(idx>9){
                    String temp = "";
                    temp = temp.concat(Character.toString(seats.charAt(idx-5))+Character.toString(seats.charAt(idx-10)) ) ;
                        if(temp.contains("P") && temp.equals("XP") == false ) return false;
                }
                //하
                if(idx<15){
                    String temp = "";
                    temp = temp.concat(Character.toString(seats.charAt(idx+5)) +Character.toString(seats.charAt(idx+10)));
                    if(temp.contains("P") && temp.equals("XP") == false ) return false;
                }
            }
        }
     
        for(idx = 0, i=0; idx<19 ;idx++,i++){
            String temp = seats.substring(idx,idx+2).concat(seats.substring(idx+5,idx+7));
            
            if(temp.replaceAll("P","").length() <=2){
                if(temp.equals("PXXP") == false && temp.equals("XPPX") == false){
                    return false;
                }
            }
            if(i==3){
                i = -1;
                idx++;
            }
        }
        return true;
    }
}

 

- 결과