2021 카카오 채용연계형 인턴십
거리두기 확인하기
https://programmers.co.kr/learn/courses/30/lessons/81302
bfs로도 풀이할 수 있겠다고 생각했지만, 나는 조금 더 심플하게 생각했다.
for(int i = 0; i<5; i++)
for(int j = 0; j<5; j++)
의 이중 포문의 형태로 0,0 부터 사람이 앉아있는 것을 확인했을 때 주변을 확인한다고 가정했을 때, 실제로 확인해야하는 블록의 형태는
이런 구조를 갖게 된다. 이 중, P가 아예 있어선 안되는 위치를 표시한다면
이러하고, 나머지는 파란색 블록으로 향하는 길이 모두 펜스로 막혀있어야만 한다.
이러한 조건을 직접 작성한다면
import java.util.*;
class Solution {
public int[] solution(String[][] places) {
int idx = 0;
int[] answer = new int[5];
for(String[] place : places){
if(check(place)){
answer[idx++] = 1;
}else{
answer[idx++] = 0;
}
}
return answer;
}
public boolean check(String[] place){
char[][] room = new char[5][5];
for(int i = 0; i<5; i++){
room[i] = place[i].toCharArray();
}
for(int i = 0; i<5; i++){
for(int j = 0; j<5; j++){
if(room[i][j]=='P'){
if(!isFine(i, j, room)){
return false;
}
}
}
}
return true;
}
public boolean isFine(int x, int y, char[][] room){
if(x+1<5 && room[x+1][y]=='P'){
return false;
}
if(y+1<5 && room[x][y+1]=='P'){
return false;
}
if(x+2<5 && room[x+2][y]=='P' && room[x+1][y] =='O'){
return false;
}
if(y+2<5 && room[x][y+2]=='P' && room[x][y+1] =='O'){
return false;
}
if(x+1<5 && y+1<5 &&room[x+1][y+1]=='P'){
if(room[x][y+1]=='O'||room[x+1][y]=='O'){
return false;
}
}
if(x-1>=0 && y+1<5 &&room[x-1][y+1]=='P'){
if(room[x][y+1]=='O'||room[x-1][y]=='O'){
return false;
}
}
return true;
}
}
이런 구조로 코드를 작성할 수 있다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
프로그래머스 자동완성 (JAVA) (0) | 2021.10.02 |
---|---|
프로그래머스 위장 (JAVA) (0) | 2021.08.08 |
프로그래머스 가장 먼 노드 (JAVA) (0) | 2021.08.01 |
프로그래머스 N으로 표현 (JAVA) (0) | 2021.08.01 |
프로그래머스 영어 끝말잇기 (JAVA) (0) | 2021.07.25 |