728x90
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/81302
※ 문제 접근 방법
- answer를 places의 길이만큼 초기화
- for문 - places 생성
- P의 위치를 담을 Queue 생성
- chArr 배열 초기화
- 문자열을 쪼개서 chArr에 값을 넣는다
- P의 위치를 Queue에 넣는다
- while문을 돈다
- visit에 P 위치 방문여부 체크
- 방향별 탐색
- 배열 크기 초과하는지 확인
- X일 때는 그냥 넘어감
- P일 땐 바로 결과 0
- O일 땐 O의 위치에서 다시 탐색
- O 주변에 P가 있을땐 바로 return 0;
- O 주변에 O, X 일땐 return 1
package checkDistance;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
/**
*
* @author dr854
* https://school.programmers.co.kr/learn/courses/30/lessons/81302
* 코딩테스트 연습 2021 카카오 채용연계형 인턴십 거리두기 확인하기
*/
public class CheckDistance {
public static void main(String[] args) {
Solution s = new Solution();
String[][] places = {{"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"}};
System.out.println(Arrays.toString(s.solution(places)));
}
}
class Solution {
int[] dy = {0, 1, 0, -1};
int[] dx = {1, 0 ,-1, 0};
String[][] chArr;
boolean[][] visit;
/**
* @param places
* @return
*/
public int[] solution(String[][] places) {
int[] answer = new int[places.length];
for (int i = 0; i < places.length; i++) {
String[] strArr = places[i];
Queue<Pos> q = new LinkedList<Pos>();
chArr = new String[5][5];
for (int j = 0; j < strArr.length; j++) {
String[] temp = strArr[j].split("");
for (int k = 0; k < temp.length; k++) {
chArr[j][k] = temp[k];
if(temp[k].charAt(0) == 'P') {
q.add(new Pos(j, k));
}
}
System.out.println(Arrays.toString(chArr[j]));
}
int result = 1;
while(!q.isEmpty()) {
Pos cur = q.poll();
visit = new boolean[5][5];
visit[cur.y][cur.x] = true;
for (int j = 0; j < 4; j++) {
int nx = dx[j] + cur.x;
int ny = dy[j] + cur.y;
if(nx < 0 || nx >= 5 || ny < 0 || ny >= 5) continue;
if("X".equals(chArr[ny][nx])) continue;
if("P".equals(chArr[ny][nx])) {
result = 0;
break;
}
result = find(ny, nx);
if(result == 0) break;
}
if(result == 0) break;
}
answer[i] = result;
System.out.println();
}
return answer;
}
public int find(int r, int c) {
visit[r][c] = true;
for (int i = 0; i < 4; i++) {
int ny = r + dy[i];
int nx = c + dx[i];
if(nx < 0 || nx >= 5 || ny < 0 || ny >= 5) continue;
if(visit[ny][nx]) continue;
if("X".equals(chArr[ny][nx])|| "O".equals(chArr[ny][nx])) continue;
return 0;
}
return 1;
}
}
class Pos {
int y,x;
public Pos(int y, int x) {
this.y = y;
this.x = x;
}
}
728x90
반응형
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/java] 멀리 뛰기 (0) | 2022.10.12 |
---|---|
[프로그래머스/java] JadenCase 문자열 만들기 (0) | 2022.09.10 |
[프로그래머스/java] 행렬 테두리 회전하기 (0) | 2022.08.24 |
[프로그래머스/java] 피로도 (0) | 2022.08.11 |
[프로그래머스/Oracle] 우유와 요거트가 담긴 장바구니 (0) | 2022.08.07 |
댓글