programmers 거리두기 확인하기(2021 카카오인턴십)

밍디·2021년 10월 22일
0

equals**
아이디어는 빨리 떠올렸으나,, 구현이 너무 느려서 시간이 걸렸다.
정말 훈련으로 구현시간을 줄일 수 있는것일까?


import java.util.*;

class Solution {
    
    static int[] dis_x={-1,0,1,0};
    static int[] dis_y={0,1,0,-1};
    
    
    public ArrayList<Integer> solution(String[][] places) {
        ArrayList<Integer> answer = new ArrayList<>();       
       
        for(int n=0;n<5;n++){
            answer.add(valid(n,places));
        }
        
        return answer;
    }
    
    public int valid(int n,String[][] places){
        String [][] map=new String[5][5];
        for(int i=0;i<5;i++){
        
            map[i]=places[n][i].split("");
        }
        
        for(int i=0;i<5;i++){
            for(int j=0;j<5;j++){
                if(map[i][j].equals("P")){

                    for(int k=0;k<4;k++){
                        
                        int nx=i+dis_x[k];
                        int ny=j+dis_y[k];
                        if(0<=nx&&nx<5&&0<=ny&&ny<5){
                
                            if(map[nx][ny].equals("P")){
                                return 0;
                                
                            }else if(map[nx][ny].equals("O")){

                                if(nx==i){//행이같을 경우 (양옆에 O가 있을경우)
                                    
                                    //좌 혹은 우로 2칸갔을때 P가 있을 경우.
                                    int temp=ny-j;
                                    if(0<=ny+temp&&ny+temp<5){
                                        if(map[nx][ny+temp].equals("P")){

                                            return 0;
                                        }
                                    }

                                    /*
                                    밑에 두개는 대각선 위치에 P가 있는지 알아보는 경우
                                    **/
                                    if(0<=nx+1&&nx+1<5){
                                        if(map[nx+1][ny].equals("P")){

                                            return 0;
                                        }
                                    }
                                    if(0<=nx-1&&nx-1<5){
                                        if(map[nx-1][ny].equals("P")){

                                            return 0;
                                        }
                                    }

                                }else{//열이 같을 경우 (상하에 o가 있을 경우 )
                                    
                                    //상 혹은 하로 2칸갔을때 P가 있을 경우.
                                    int temp=nx-i;
                                    if(0<=nx+temp&&nx+temp<5){
                                        if(map[nx+temp][ny].equals("P")){

                                            return 0;
                                        }
                                    }
                                    
                                    /*
                                    밑에 두개는 대각선 위치에 P가 있는지 알아보는 경우
                                    **/
                                    if(0<=ny+1&&ny+1<5){

                                        if(map[nx][ny+1].equals("P")){

                                            return 0;
                                        }
                                    }
                                    if(0<=ny-1&&ny-1<5){
                                        if(map[nx][ny-1].equals("P")){

                                            return 0;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        return 1;
    }
}
profile
노후를 위해 꾸준히 공부하자.

0개의 댓글