Algorithm/Programmers

[Programmers - 자바] 거리두기 확인하기

tjddneva 2022. 3. 16. 21:13

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

 

일일히 다 확인하다가 한번 죽고나서 생각을 바꾸었다.

 

거리두기 위반하는 경우는 응시자 간의 거리가 1 이거나 2 인 경우이다. 이거를 한 번 자세히 알아보자.

 

거리가 1인경우

P가 상하좌우 붙어있어야한다. 따라서 배열에서 P를 기준으로 상하좌우를 체크해서 P 가 붙어있는지 확인한다!

 

거리가 2인경우

2인경우는 2가지가 있다.

P O    P  O  P  

   P

 

이 두가지 경우이다. 고로 배열에서 O 인경우 상하좌우를 체크해서 P가 2개 이상있는지 확인하면 된다!

 

와 획기적인 방법!

 

아래는 전체 코드이다.

import java.io.*;
import java.util.*;

class Solution {
    public int[] solution(String[][] places) {
        int[] answer = {};
        answer = new int[5];
        int[] dx = {0,0,-1,1};
        int[] dy = {-1,1,0,0};
        
        char[][] padded = new char[9][9];    
        for(int z=0; z<5; z++){
        
            for(int i=0; i<9; i++){
                for(int j=0; j<9; j++){
                    if(i<2 || i>6 || j<2 || j>6){
                        padded[i][j] = 'O';
                    }
                    else{
                        padded[i][j] = places[z][i-2].charAt(j-2);
                    }
                }
            }
            
            int countp, counto;
            int flag = 1;
            loopout:
            for(int i=2; i<7; i++){
                for(int j=2; j<7; j++){
                    counto = 0; countp = 0;
                    char cur;
                    if(padded[i][j]=='O'){
                        for(int k=0; k<4; k++){
                            cur = padded[i+dy[k]][j+dx[k]];
                            if(cur == 'P') counto++;
                        }
                        if(counto >=2){
                            flag=0;
                            break loopout;
                        }
                    }
                    else if(padded[i][j]=='P'){
                        for(int k=0; k<4; k++){
                            cur = padded[i+dy[k]][j+dx[k]];
                            if(cur == 'P') countp++;
                        } 
                        if(countp >=1){
                            flag = 0;
                            break loopout;
                        }
                    }     
                }
            }
            if(flag == 1){
                answer[z] = 1;
            }
            flag = 1;
            
        }
            
        
        return answer;
    }
}