https://school.programmers.co.kr/learn/courses/30/lessons/81302
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
다음과 같은 규칙으로 대기실에 거리를 두고 앉도록 안내합니다.
1. 대기실은 5개이며, 각 대기실은 5x5 크기입니다.
2. 거리 두기를 위하여 응시자들끼리는 맨해튼 거리가 2 이하로 앉지 말아 주세요.
3. 단 응시자가 앉아있는 자리 사이가 파티션으로 막혀 있을 경우에는 허용합니다.

각 대기실별로 거리 두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 배열에 담아 return 하도록 solution함수를 완성해 주세요.
📗 풀이과정
1. 맨해튼 거리가 2 이하인 경우는 아래의 그림처럼 3가지로 나눌 수 있습니다.

2. (1)의 경우에는 대기자 P가 있으면 거리 두기를 지키지 않은 것으로 result배열에 0을 넣어줍니다.
3. (2)의 경우에는 색칠된 자리에 P가 있다면, P와 색칠된 칸 사이에 파티션 X가 있어야 합니다.
만약 그렇지 않다면 result배열에 0을 넣어주고 더 이상 검사하지 않습니다.
4. (3)의 경우에는 P에서 색칠된 칸에 도달하기까지의 칸이 모두 X로 파티션이어야 합니다.

5. 5x5 크기의 대기실 자리를 모두 돌면서 대기자 P가 있으면 2-4의 조건을 검사해, 하나라도 어기게 된다면 0을, 모두 거리 두기를 지키고 있다면 1을 result에 반환하면 됩니다.
전체코드
class Solution {
public int[] solution(String[][] places) {
int[] answer = new int[places.length];
for(int i=0;i<places.length;i++) answer[i]=checkDis(places[i]);
return answer;
}
//거리두기를 하고 있는지 확인
int checkDis(String[] place){
int[] dx={1,-1,0,0};//상하좌우
int[] dy={0,0,1,-1};
int[] dx2={1,1,-1,-1};//대각선
int[] dy2={-1,1,-1,1};
for(int x=0;x<5;x++){
for(int y=0;y<5;y++){
if(place[x].charAt(y)=='P'){//대기자를 확인하면 주위에 대기자가 있는지 확인
//상하좌우에 대기자 있는지 확인
for(int dir=0;dir<4;dir++){
int nx=x+dx[dir];
int ny=y+dy[dir];
//(1) 거리=1인 상하좌우에 대기자 있는지 확인
if(nx>=0 && nx<5 && ny>=0 && ny<5 && place[nx].charAt(ny)=='P')
return 0;
//상하좌우(거리=1)에 파티션이 없을 때
if(nx>=0 && nx<5 && ny>=0 && ny<5 && place[nx].charAt(ny)!='X'){
// (2) 거리=2인 곳에 대기자 있는지 확인
nx+=dx[dir];
ny+=dy[dir];
if(nx>=0 && nx<5 && ny>=0 && ny<5 && place[nx].charAt(ny)=='P')
return 0;
}
}
// (3) 대각선에 거리두기 하고 있는지 확인
for(int dir=0;dir<4;dir++){
int nx=x+dx2[dir];
int ny=y+dy2[dir];
//대기자 있으면, 파티션이 주위에 있는지 확인
if(nx>=0 && nx<5 && ny>=0 && ny<5 && place[nx].charAt(ny)=='P'){
if(place[x].charAt(ny)!='X' || place[nx].charAt(y)!='X')
return 0;
}
}
}
}
}
return 1;//거리두기 잘 됨.
}
}'Algorithms(CT) > Programmers' 카테고리의 다른 글
| [프로그래머스] Lv.2 멀쩡한 사각형 (Java) (0) | 2023.07.27 |
|---|---|
| [프로그래머스] Lv.2 숫자 카드 나누기 (Java) (0) | 2023.07.27 |
| [프로그래머스] Lv.2 점 찍기 (Java) (0) | 2023.07.21 |
| [프로그래머스] Lv.2 호텔 대실 (Java) (0) | 2023.07.21 |
| [프로그래머스]Lv.2 배달 (Java) (0) | 2023.07.20 |