1. 문제
봉우리를 구하는 문제이다.
N * N 격자판의 숫자 중, 자신의 상하좌우 보다 큰 숫자를 봉우리 지역이라한다.
격자의 가장 자리는 0으로 초기화 되어있다.
칭하고 봉우리 지역의 개수를 출력하자.
2 - 1. 나의 풀이
이 문제도 쉽지만, 배열을 다루는 만큼 배열 범위를 넘지 않게 조심하자!
1. 가장자리를 0 으로 초기화 하기 위해 int 배열의 크기를 [n+2][n+2]로 초기화한다.
2. 봉우리를 찾는다. i 는 1부터 n +1 번째 인덱스까지!
3. 봉우리를 count 해주면 끝
2 - 2. 나의 코드
package Algorythm_Array;
import java.util.Scanner;
public class Array10 {
public static int solution(int[][] intArr, int n) {
int count =0;
//반복 범위를 1 부터 n + 1 까지 (가장자리 0은 탐색하지 않으므로.)
for (int i = 1; i < n + 1; i++) {
for (int j = 1; j < n + 1; j++) {
//상하좌우 보다 크면 count++
if( (intArr[i][j] > intArr[i-1][j]) && (intArr[i][j] > intArr[i +1][j]) &&
(intArr[i][j] > intArr[i][j-1]) && (intArr[i][j] > intArr[i][j+1])) count++;
}
}
return count;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] intArr = new int[n + 2][n + 2];
for (int i = 1; i < n + 1; i++) {
for (int j = 1; j < n + 1; j++) {
intArr[i][j] = sc.nextInt();
}
}
System.out.println(solution(intArr , n));
}
}
3 - 1. 강의 풀이
삼중 for문으로 문제를 풀이한다.
간결하고 좌표적으로 해석해서 푼거같다.
가장자리 0을 배열을 확장해 표현하지 않고 조건으로 따져서 푼다.
1. dx와 dy 에 상하좌우에 접근하기 위한 숫자를 미리 초기화한후
이중 for문 안에 for문을 하나 추가해(총, 삼중 for문) nx = i + dx[k]; ny = i + dy[k]; 로 상하좌우에 접근한다.
2. flag 개념을 사용해 조건에 어긋나면 flag 를 false로 돌리고 flag가 true 일 때만 카운팅한다.
3 - 2. 강의 코드
import java.util.Scanner;
public class Array10_solution {
public static int solution(int[][] arr, int n) {
int answer=0;
//상하좌우 인덱스에 접근하기위해 dx, dy를 사용한다.
//dx, dy를 사용하기 위해서 for문을 기존 보다 한 번 더 돈다.
int[] dx = {-1, 0, 1, 0};
int[] dy = { 1, 0,-1, 0};
for (int i = 0; i < n; i++) {
boolean flag = true;
for (int j = 0; j < n; j++) {
//아래 반복문이 끝나면 한 격자칸의 숫자 상하좌우 탐색이 끝.
for (int k = 0; k < 4; k++) {
int nx = i + dx[k];
int ny = i + dy[k];
//상하좌우로 갈때 인덱스 범위를 넘어가면 안되므로 조건을 걸어준다.
//(arr[nx][ny] >= arr[i][j]) 이 부분을 꼭 조건 마지막에 달아야함!
if( nx > 0 && nx < n && ny <0 && ny <n && (arr[nx][ny] >= arr[i][j])){
flag = false;
break;
}
}/*탐색 끝*/ if(flag==true) answer++;
}
}
return answer;
}
public static void main(String[] args) {
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(solution(arr, n));
}
}
4. 얻어갈 점
1. 반복적인 좌표적 접근의 새로운 풀이법 (미리 움직일 만큼을 초기화하고 for문 돌리기 ex)dx, dy)
2. flag 개념
'자바 알고리즘 문제풀이 > Array(1, 2차원 배열)' 카테고리의 다른 글
12. 멘토링 (1) | 2023.09.17 |
---|---|
11. 임시반장 정하기 (2) | 2023.09.16 |
9. 격자판 최대합 (0) | 2023.09.14 |
8. 등수 구하기 (1) | 2023.09.11 |
7. 점수 계산 (0) | 2023.09.10 |