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;
}
}