728x90
본 알고리즘 풀이는 Routine Study에서 진행하고 있습니다.
https://github.com/ROUTINE-STUDY/Algorithm
저를 포함한 구성원이 대부분 초보이므로, 원하시는분은 언제라도 들어오셔도 좋습니다.
문의는 댓글 바람.
문제 출처 :https://www.acmicpc.net/problem/2589
[문제 설명]
육지에서 가장 먼 두 곳이 보물이 있는 곳이다. 보물의 거리를 구하시오.
[접근 방법]
모든 육지를 완전탐색으로 찾고, 그 지점에서 주변을 BFS한다.
완전탐색 O(N^2)
BFS O(N+4*N) => 모든 정점의 개수 + 모든 간선의 개수 => 정점의 개수 최대 50 + 모든 간선의 개수(모든 정점 개수*4방향) => 250
총 시간복잡도는 O(N^3)이 될 듯하다.
[Java 코드]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int width;
static int height;
static char[][] map;
static int[][] directions = {{-1,0},{0,1},{1,0},{0,-1}};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
height = Integer.parseInt(st.nextToken());
width = Integer.parseInt(st.nextToken());
map = new char[height][width];
for (int i = 0; i < height; i++) {
map[i] = br.readLine().toCharArray();
}
int distance = Integer.MIN_VALUE;
for (int idxOfHeight = 0; idxOfHeight < height; idxOfHeight++) {
for (int idxOfWidth = 0; idxOfWidth < width; idxOfWidth++) {
if (map[idxOfHeight][idxOfWidth] == 'L') {
boolean[][] isVisited = new boolean[height][width];
distance = Math.max(distance, bfs(isVisited, idxOfHeight, idxOfWidth));
}
}
}
System.out.println(distance);
}
private static int bfs(boolean[][] isVisited, int idxOfHeight, int idxOfWidth) {
Queue<int[]> q = new LinkedList<>();
q.offer(new int[]{idxOfHeight, idxOfWidth});
int distance = -1;
while (!q.isEmpty()) {
int cntOfSameDepth = q.size();
for (int i = 0; i < cntOfSameDepth; i++) {
int[] currentLocation = q.poll();
isVisited[currentLocation[0]][currentLocation[1]] = true;
for (int[] direction : directions) {
int[] nextLocation = new int[]{currentLocation[0] + direction[0], currentLocation[1]+direction[1]};
if (0 <= nextLocation[0] && nextLocation[0] < height && 0 <= nextLocation[1] && nextLocation[1] < width) {
if (isVisited[nextLocation[0]][nextLocation[1]]) {
continue;
}
if (map[nextLocation[0]][nextLocation[1]] == 'L') {
q.offer(nextLocation);
isVisited[nextLocation[0]][nextLocation[1]] = true;
}
}
}
}
distance++;
}
return distance;
}
}
728x90
반응형
'알고리즘 문제 풀이 > 완전탐색' 카테고리의 다른 글
백준 - 감시 피하기(Kotlin) (0) | 2022.02.05 |
---|---|
백준 - 모든 순열(Java) (0) | 2022.02.01 |
백준 - 연산자 끼워넣기(Java) (0) | 2022.01.25 |
백준 - 부분수열의 합(Java) (0) | 2022.01.25 |
백준 - 대표 자연수 (0) | 2022.01.25 |