알고리즘/프로그래머스 Level2

[프로그래머스,Java] Level2: 거리두기 확인하기

류창 2021. 11. 3. 22:21
반응형

 

문제분석

 

카카오는 하나같이 역시 좀 쉽지가않은거같다

 

맵에는 P(응시자), O(빈 테이블) ,X(파티션)이 존재한다.

 

규칙1,응시자 사이의 맨허튼거리가 2이면 거리두기를 지키지 않았으므로, 0을 반환해야한다.

 

규칙2,응시자 사이의 맨허튼거리가 2라도, 사이에 파티션이 있으면 거리두기는 지킨걸로 본다.

 

 

우선적으로, 응시자 P를 기준으로 확인해야하니, P일때만 찾는로직을 실행시키면된다.

 

필자의풀이

그런데 필자는 조금 무식(노가다)하게 풀었다.

 

이 찾는로직을 

Case 상:  -> 한번더 상, 좌, 우

Case 하:  -> 한번더 하, 좌, 우

Case 좌:  -> 한번더 좌 상 하

Case 우:  -> 한번더 우 상 하

 

를 모두 나눠서 빡코딩을했다. 뭐.. 풀긴 풀었지만 창의력에 한계를 느낀것같다. 뭔가더 좋은 방법이 있을거같은데..

 

 

스마트한 다른사람의 접근방식 

DP형식으로 풀은 사람이 계신다.

 

다른사람은, map을 모두 돌면서, P일때 P 좌표와 상, 하 ,좌, 우 값에 -1을 넣어줬다.  

 

X이면, 큰 수를 넣어준다. 10 정도?

 

만약, map에 -2가 있다면, 거리두기를 지키지 않은것이다.

 

가독성도 그렇고, 남들 코드 이해시키기도 쉬운것같다. 

 

문제풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
class Solution {
    public int[] solution(String[][] places) {
        int[] answer = new int[5];
        answer[0]=1;
        answer[1]=1;
        answer[2]=1;
        answer[3]=1;
        answer[4]=1;
        
        boolean flag =false;
        for(int i=0;i<places.length;i++){
            //대기실 세팅
            char[][] map = new char[5][5];
            for(int j=0;j<places.length;j++){
                char[] temp=places[i][j].toCharArray();
                map[j]=temp;
            }
            
            //응시자 'P' 찾기
      Loop1:   for(int j=0;j<5;j++){
                for(int k=0;k<5;k++){
                    if(map[j][k]=='P'){
                       flag=search(j,k,map);
                        
                        if(flag==false){
                        answer[i]=0;
                        break Loop1;
                    }
                    }
                    
                    
                }
            }
            
        }
        return answer;
    }
    
    public boolean search (int j, int k,char[][] map){
        
        //위로갈때 분기
        if(j!=4){
            if(map[j+1][k]=='P'){
                return false;
            }
            else if(map[j+1][k]=='O'){
                if(j!=3&&map[j+2][k]=='P'return false;
                if(k!=4&&map[j+1][k+1]=='P'return false;
                if(k!=0&&map[j+1][k-1]=='P'return false;
            }
        }
        if(j!=0){
            if(map[j-1][k]=='P'){
                return false;
            }
            else if(map[j-1][k]=='O'){
                if(j!=1&&map[j-2][k]=='P'return false;
                if(k!=4&&map[j-1][k+1]=='P'return false;
                if(k!=0&&map[j-1][k-1]=='P'return false;
            }
        }
        
        if(k!=4){
            if(map[j][k+1]=='P'){
                return false;
            }
            else if(map[j][k+1]=='O'){
                if(k!=3&&map[j][k+2]=='P'return false;
                if(j!=4&&map[j+1][k+1]=='P'return false;
                if(j!=0&&map[j-1][k+1]=='P'return false;
            }
        }
        
        if(k!=0){
            if(map[j][k-1]=='P'){
                return false;
            }
            else if(map[j][k-1]=='O'){
                if(k!=1&&map[j][k-2]=='P'return false;
                if(j!=4&&map[j+1][k-1]=='P'return false;
                if(j!=0&&map[j-1][k-1]=='P'return false;
            }
        }
        
        return true;
    }
    
}
cs
반응형