문제
설명
지도 정보가 N*N 격자판에 주어집니다. 각 격자에는 그 지역의 높이가 쓰여있습니다.
각 격자판의 숫자 중 자신의 상하좌우 숫자보다 큰 숫자는 봉우리 지역입니다. 봉우리 지역이 몇 개 있는 지 알아내는 프로그램을 작성하세요.
격자의 가장자리는 0으로 초기화 되었다고 가정한다.
만약 N=5 이고, 격자판의 숫자가 다음과 같다면 봉우리의 개수는 10개입니다.
입력
첫 줄에 자연수 N이 주어진다.(2<=N<=50)
두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다. 각 자연수는 100을 넘지 않는다.
출력
봉우리의 개수를 출력하세요.
선생님 풀이
import java.util.Scanner;
public class Main2_10 {
int[] dx = {-1, 0, 1, 0};
int[] dy = {0, 1, 0, -1};
public int Solution(int n, int[][] arr) {
int answer=0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
boolean flag = true;
for (int k = 0; k < 4; k++) {
int nx = i+dx[k]; // 위, 오른, 아래, 왼쪽 네 방향의 x, y좌표
int ny = j+dy[k];
if(nx>=0 && nx<n && ny>=0 && ny<n && arr[nx][ny] >= arr[i][j]) {
// 네 방향으로 이동했을 때 좌표가 배열 범위 안에 있어야 하고, 가운데 값보다 작아야 봉우리
flag = false; // 네 방향 중 한 방향의 값이 가운데 값보다 클 경우 false
break;
}
}
if(flag) answer++;
}
}
return answer;
}
public static void main(String[] args) {
Main2_10 T = new Main2_10();
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] arr = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
arr[i][j] = sc.nextInt();
}
}
System.out.println(T.Solution(n, arr));
}
}
결과
알게된 점
위 문제는 이동할 좌표(nx, ny)의 인덱스가 유효한지 (0~n-1 사이에 있는지) 확인해야 하는데
나는 계속 조건문 자체에 arr[i][j] > arr[i-1][j] 이런 식으로 네 방향 적어놓아서 IndexOutOfBoundsException 떴지만 해결할 수 없었다. (테두리에 000000을 추가하지 않는 이상 풀 수 없는 방식)
특정 좌표에서 근접 좌표들에 접근할 때
int[] dx = {-1, 0, 1, 0};
int[] dy = {0, 1, 0, -1};
위의 방향 배열을 만든 후 for(int k=0; k<4; k++) nx = i + dx[k]; ny = j + dy[k]; 식으로 접근한다는 발상에 놀랐다.
다른 문제에서도 많이 쓰이는 것 같으니 알고 넘어가는 게 좋겠다 !
(+) 순환을 이용해서 풀 수 있지 않을까?? 시간될 때 순환으로 풀어봐야겠다.
'Algorithm > Inflearn' 카테고리의 다른 글
[Inflearn] 자바 알고리즘 문제풀이 #02-11 11. 임시반장 정하기 (0) | 2022.11.28 |
---|---|
[Inflearn] 영리한 프로그래밍을 위한 알고리즘 - 순환 (Recursion) 의 응용 : n queens problem (0) | 2022.11.22 |
[Inflearn] 영리한 프로그래밍을 위한 알고리즘 - 순환 (Recursion) 의 응용 : Counting Cells in a Blob (0) | 2022.11.21 |
[Inflearn] 자바 알고리즘 문제풀이 #02-09 9. 격자판 최대합 (0) | 2022.11.21 |
[Inflearn] 자바 알고리즘 문제풀이 #02-08 8. 등수구하기 (0) | 2022.11.21 |