알고리즘 공부
[백준 1245번] 산봉우리 - java
철매존
2024. 12. 15. 21:12
728x90
반응형
문제 설명
1. 격자 N M 이 주어진다.
2. 맵이 주어지고 높이가 주어진다.
3. 현재 높이 기준으로
- 같은 높이 : 같은 산봉우리
- 같은 산봉우리 주변에는 얘보다 낮은 높이밖에 없어야 한다.
4. 산봉우리 개수를 구하면 된다.
풀이 과정
1. DFS문제이다.
2. 모든 위치에서 주변 7방향 모두를 확인해준다.
3. 그 중에 하나라도 얘보다 높으면 이건 산봉우리가 아니다.
4. 같은 높이가 있으면 걔도 같은 산봉우리인지 확인해야 한다. 그 주변 애가 산봉우리가 아니라면 당연히 얘도 아니다.
5. 산봉우리인지 체크를 한다면 그거는 모두 방문처리해준다.
6. 그리고 산봉우리인지 return해서 호출한 메인쪽에서 확인해서 구하면 된다.
코드
/******************************************************************************
Online Java Compiler.
Code, Compile, Run and Debug java program online.
Write your code in this editor and press "Run" button to execute it.
*******************************************************************************/
import java.util.*;
public class Main
{
private static int map[][];
private static int N, M;
private static boolean check[][];
private static int xMove[] = {1, 1, 1, 0, 0, -1, -1, -1};
private static int yMove[] = {1, -1, 0, 1, -1, -1, 0, 1};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
M = sc.nextInt();
sc.nextLine();
map = new int[N][M];
check = new boolean[N][M];
for (int i=0; i<N; i++) {
String input = sc.nextLine();
String[] inputStr = input.split(" ");
for(int j=0; j<M; j++) {
map[i][j] = Integer.parseInt(inputStr[j]);
}
}
int ans = 0;
for(int i=0; i<N; i++) {
for(int j=0; j<M; j++) {
if(!check[i][j]) {
if(DFS(i, j)) ans++; // 산봉우리가 맞다면 정답 취급해준다.
}
}
}
System.out.println(ans);
}
private static boolean DFS(int x, int y) {
check[x][y] = true; // 해당 위치는 확인했다고 표시
int now = map[x][y]; // 현재 위치의 높이
boolean isPeak = true; // 아무 문제 없으면 산봉우리
// 여기서 확인한다.
for(int i=0; i<xMove.length; i++) {
int xTo = x + xMove[i];
int yTo = y + yMove[i];
if (xTo<0 || yTo<0 || xTo>=N || yTo>=M) continue; // 맵 안에 위치하고
if (map[xTo][yTo] > now) isPeak = false; // 인접 지형이 하나라도 높은 칸이면 산봉우리가 아니다.
else if (map[xTo][yTo] == now && !check[xTo][yTo]) { // 인접 지형이 같은 높이면 얘도 확인해야한다. 한번 봤으면 더 안봄(계속 서로 볼수 있으니)
if (!DFS(xTo, yTo)) { // 그래서 인접한 같은 높이도 산봉우리가 아니면 이것도 산봉우리가 아니다.
isPeak = false;
}
}
}
return isPeak; // 산봉우리인지 아닌지 반환
}
}
반응형