https://school.programmers.co.kr/learn/courses/30/lessons/81302#
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr

맨해튼 거리가 2이하인 곳에 지원자가 앉아 있는지? 앉아있다면 그 사이 파티션으로 막혀있는지?를 확인한다.

일단 확인해야하는 범위를 그림으로 나타내어보자면 이런 느낌...
분홍색은 맨해튼거리가 1, 파란색은 2인 곳이다.
맨해튼 거리가 1인 경우 > 쉽다 그냥 핑크색인 부분이 P인지 아닌지만 확인해주면 끝.
맨해튼 거리가 2인 경우는 두 가지로 나누어 풀었는데
- 직선(상하좌우)에 있는 경우; 새로운 좌표가 P이고 좌표끼리 더해서 나누기 2한 좌표에 X있음? 확인.
- 대각선에 있는 경우; 새로운 좌표가 P이고 {i,nj} {ni,j} 둘 다 X인지 아닌지 확인. (둘 다 X여야만 통과)
새로운 좌표가 0보다 작진 않은지, 범위를 벗어나진 않는지 확인해주자.
써놓고보니까 말이 좀 이상하긴 한데 흠.
import java.util.*;
class Solution {
static int[][] dir = {{1,0},{0,1},{-1,0},{0,-1}};
static int[][] dir1 = {{2,0},{-2,0},{0,2},{0,-2}};
static int[][] dir2 = {{1,1},{-1,1},{-1,-1},{1,-1}};
public int[] solution(String[][] places) {
int[] answer = new int[5];
for(int i=0;i<5;i++){
answer[i]=aaa(places[i]);
}
return answer;
}
static int aaa(String ss[]){
int ans = 1;
char[][] bb = new char[5][5];
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
bb[i][j]=ss[i].charAt(j);
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
if(bb[i][j]=='P'){
//맨 1
for(int k=0;k<4;k++){
int ni = i+dir[k][0];
int nj = j+dir[k][1];
if(ni<0||ni>=5)continue;
if(nj<0||nj>=5)continue;
if(bb[ni][nj]=='P') return 0;
}
//맨2
for(int k=0;k<4;k++){
int ni = i+dir1[k][0];
int nj = j+dir1[k][1];
if(ni<0||ni>=5)continue;
if(nj<0||nj>=5)continue;
if(bb[ni][nj]=='P' &&
bb[(ni+i)/2][(nj+j)/2]!='X')
return 0;
}
//맨2 - 대각선
for(int k=0;k<4;k++){
int ni = i+dir2[k][0];
int nj = j+dir2[k][1];
if(ni<0||ni>=5)continue;
if(nj<0||nj>=5)continue;
if(bb[ni][nj]=='P' && (bb[ni][j]!='X'||bb[i][nj]!='X'))
return 0;
}
}
}
}
return ans;
}
}
<리뷰>
- dir1 굳이 왜 만들었을까 dir에서 *2하면 더 좋았을텐데 애초에 1이랑 같이 처리하기도 좋았을 듯.
- 교재 코드는 내가 어디서 왔는지 방향도 넘겨줘서 검사하는 방법도 있었는데... 이 정도 사이즈에선 그냥 냅다 좌표 저장해두고 검사해보는게 빠르지 않나? 라는 생각.
'Programmers > Java, Ruby' 카테고리의 다른 글
| 프로그래머스 Java : 문자열 압축 (0) | 2026.08.20 |
|---|---|
| 프로그래머스 Java : 구슬을 나누는 경우의 수 (0) | 2026.08.20 |
| 프로그래머스 Java : 영어가 싫어요 (0) | 2026.08.19 |
| 프로그래머스 Java : 삼각 달팽이 (0) | 2026.08.18 |
| 프로그래머스 Java : 이진수 더하기 (0) | 2026.08.18 |