-
(Java) Programmers 거리두기 확인하기 (BFS, Queue)Algorithm 2023. 3. 17. 07:14728x90반응형
- 목차
문제 설명.
개발자를 희망하는 죠르디가 카카오에 면접을 보러 왔습니다.
코로나 바이러스 감염 예방을 위해 응시자들은 거리를 둬서 대기를 해야하는데 개발 직군 면접인 만큼
아래와 같은 규칙으로 대기실에 거리를 두고 앉도록 안내하고 있습니다.- 대기실은 5개이며, 각 대기실은 5x5 크기입니다.
- 거리두기를 위하여 응시자들 끼리는 맨해튼 거리1가 2 이하로 앉지 말아 주세요.
- 단 응시자가 앉아있는 자리 사이가 파티션으로 막혀 있을 경우에는 허용합니다.
5개의 대기실을 본 죠르디는 각 대기실에서 응시자들이 거리두기를 잘 기키고 있는지 알고 싶어졌습니다. 자리에 앉아있는 응시자들의 정보와 대기실 구조를 대기실별로 담은 2차원 문자열 배열 places가 매개변수로 주어집니다. 각 대기실별로 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 배열에 담아 return 하도록 solution 함수를 완성해 주세요.
문제 풀이.
해당 문제는 BFS 를 통한 탐색을 수행해야합니다.
탐색의 시작점은 map 상에서 "P" 인 위치들이 되구요.
"P" 와 그 다음 "P" 사이의 간격이 맨해튼 거리 2 이하가 되지 않아야 합니다.
아래의 대기실 예시로 들어보겠습니다.
POOOP
OOOOO
OOOOO
OOOOO
OOOOO
대기자는 2명이며, 각각 (0,0) 과 (0,4) 위치에 존재합니다.
(0,0) 을 시작으로 BFS 탐색을 수행하면, 문제없이 완전탐색을 완료할 수 있습니다.
(0,4) 또한 마찬가지입니다.
반면,
아래의 케이스에선 완전탐색을 마무리할 수 없습니다.
POOOO
OPOOO
OOOOO
OOOOO
OOOOO
아래의 순서로 이어지는 BFS 탐색 과정에서
(0,0) -> (0,1)
(0,0) -> (1,0)
(1,0) -> (1,1)
(1,1) 을 탐색하는 시점에 맨해튼 거리가 2가 되기 때문이죠.
문제 풀이.
import java.util.*; class Solution { public int[] solution(String[][] places) { int[] answer = new int[5]; for (int i = 0; i < 5; i++) { answer[i] = bfs(places[i]); } return answer; } int bfs (String[] place) { int[] dx = {0, -1, 0, 1}; int[] dy = {-1, 0, 1, 0}; String[][] map = new String[5][5]; boolean[][] visited = new boolean[5][5]; int[][] distance = new int[5][5]; for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { map[i][j] = place[i].substring(j, j + 1); } } for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { if (visited[i][j]) continue; if (!map[i][j].equals("P")) continue; Queue<int[]> queue = new LinkedList(); queue.add(new int[]{i, j}); visited[i][j] = true; while (!queue.isEmpty()) { int[] curPosition = queue.poll(); int curX = curPosition[1]; int curY = curPosition[0]; for (int k = 0; k < 4; k++) { int nextX = curX + dx[k]; int nextY = curY + dy[k]; if (nextY > 4) continue; if (nextX > 4) continue; if (nextY < 0) continue; if (nextX < 0) continue; if (visited[nextY][nextX]) continue; if (map[nextY][nextX].equals("P") && distance[curY][curX] <= 1) { return 0; } if (map[nextY][nextX].equals("O")) { queue.add(new int[]{nextY, nextX}); distance[nextY][nextX] = distance[curY][curX] + 1; visited[nextY][nextX] = true; } } } } } return 1; } }
반응형'Algorithm' 카테고리의 다른 글
[Programmers] 할인 행사 (lv2, Java, Map) (0) 2023.03.27 [Programmers] 기능개발 (lv2, Java) (0) 2023.03.25 [Python] Programmers 점프와 순간 이동 (0) 2023.03.16 [Programmers] 요격 시스템 ( PriorityQueue ) (0) 2023.03.12 [Python] Programmers 카펫 (0) 2023.03.07