처음 풀이
1. 한 고사장을 char[][] 배열에 담고, 지원자의 위치를 int[] 형태로 list에 저장한다.
2. 한 고사장 내 모든 지원자들끼리 거리두기가 지켜졌는지 확인한다.
- 한 고사장 내에서 한 명이라도 거리두기가 지켜지지 않았으면 0
-> 맨허튼 거리가 1이면 무조건 false, 2이면, 두 지원자 사이가 파티션일 때만 true, 아니면 false고 3이상이면 true다.,
solution()
public void solution(String[][] places) {
int[] answer = new int[5];
char[][] map = new char[5][5];
List<int[]> pLocList = new ArrayList<>();
for (int i = 0; i < 5; i++) {
pLocList.clear();
//map 채우기, p 위치 저장
for (int j = 0; j < 5; j++) {
for (int k = 0; k < 5; k++) {
char now = places[i][j].charAt(k);
map[j][k] = now;
if (now=='P') {
pLocList.add(new int[]{j, k});
}
}//for end
}//for end
boolean isFinished = false;
//모든 p끼리 check
int numOfP = pLocList.size();
for (int j = 0; j < numOfP-1; j++) {
for (int k = 1; k < numOfP; k++) {
if (!check(pLocList.get(j), pLocList.get(k), map)) {
isFinished = true;
break;
}
}//for end
if (isFinished) break;
}//for end
if (!isFinished) answer[i] = 1;
}//for end
}//solution() end
check()
- 두 지원자가 거리두기가 지켜졌는지 확인하는 method
public boolean check(int[] loc1, int[] loc2, char[][] map) {
int rowMax = -1;
int rowMin = -1;
int colMax = -1;
int colMin = -1;
if (loc1[0]>=loc2[0]) {
rowMax = loc1[0];
rowMin = loc2[0];
} else {
rowMax = loc2[0];
rowMin = loc1[0];
}
if (loc1[1]>=loc2[1]) {
colMax = loc1[1];
colMin = loc2[1];
} else {
colMax = loc2[1];
colMin = loc1[1];
}
int rowCal = rowMax-rowMin;
int colCal = colMax-colMin;
//맨허튼 거리
int mDist = rowCal + colCal;
/**
* 맨허튼 거리가 1이면 무조건 false
* 2이면, 두 지원자 사이가 파티션일 때만 true, 아니면 false다.
* 3이상이면, 무조건 true
*/
if (mDist==1) {
return false;
} else if (mDist==2) {
//같은 가로선, 세로선일 땐 중간 위치만 확인
/**
* 1 __ 2 이거나,
* 1
* __
* 2 인 경우
*/
if (rowMax==rowMin) {
if(map[rowMax][colMin+1]!='X') return false;
} else if (colMax==colMin) {
if (map[rowMin+1][colMax]!='X') return false;
} else if (rowMax!=rowMin && colMax!=colMin) {
//두 지원자가 대각선 위치에 있으면 두 중간 위치 확인
/**
* 1 __
* __ 2
*/
if (map[loc1[0]][loc2[1]]!='X') return false;
if (map[loc2[0]][loc1[1]]!='X') return false;
}
}
return true;
}//getMDistance() end
'자료구조 & 알고리즘 > 문제풀이' 카테고리의 다른 글
에디터 - 백준 1406번 (Java) (0) | 2022.05.14 |
---|---|
순위검색 - 프로그래머스 (Java, Level 2) (0) | 2022.05.02 |
메뉴 리뉴얼 - 프로그래머스 (Java, Level 2) (0) | 2022.04.29 |
빛의 경로 사이클 - 월간 코드 챌린지 시즌3 (Java, Level 2) (0) | 2022.04.26 |
소수찾기 - 프로그래머스 (Java, Level 2) (0) | 2022.04.10 |
댓글