코딩테스트/기타
[배열] 봉우리 .java
머밍
2024. 10. 21. 12:14
설명
지도 정보가 N*N 격자판에 주어집니다. 각 격자에는 그 지역의 높이가 쓰여있습니다.
각 격자판의 숫자 중 자신의 상하좌우 숫자보다 큰 숫자는 봉우리 지역입니다. 봉우리 지역이 몇 개 있는 지 알아내는 프로그램을 작성하세요.
격자의 가장자리는 0으로 초기화 되었다고 가정한다.
만약 N=5 이고, 격자판의 숫자가 다음과 같다면 봉우리의 개수는 10개입니다.
입력
첫 줄에 자연수 N이 주어진다.(2<=N<=50)
두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다. 각 자연수는 100을 넘지 않는다.
출력
봉우리의 개수를 출력하세요.
예시 입력 1
5
5 3 7 2 3
3 7 1 6 1
7 2 5 3 4
4 3 6 4 1
8 7 3 5 2
예시 출력 1
10
내 풀이
int[] dx = {-1, 0, 1, 0};int[] dy = {0, 1, 0, -1};
-> 현재 위치를 기준으로 순서대로 상,우,하,좌의 시계 방향으로 탐색
1. 입력받은 2차원 배열을 0으로 이루어진 행과 열을 하나씩 추가하여 n+1 * n*1의 이차원배열 생성
2. 이중 for문으로 각각의 숫자에 접근하여 각 숫자마다 인접한 상하좌우의 원소들과 비교
-> 새로운 위치를 설정할 때, 인덱스가 0보다 크고 n+1보단 작아야한다
3. 만약 인접한 4개의 숫자 중 하나라도 현재 위치한 수보다 크거나 같으면 봉우리가 될 수 없기에 find 변수를 두어 검사
-> 봉우리가 아니면 바로 for문 나가기
4. 인접한 4개의 숫자를 다 검사한 뒤에도 find가 참이면 봉우리이기 때문에 정답 증가
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] arr = new int[n + 1][n + 1];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
arr[i][j] = sc.nextInt();
}
}
//위 -> 오 -> 아래 -> 왼의 순서로 탐색
int[] dx = {-1, 0, 1, 0};
int[] dy = {0, 1, 0, -1};
int answer = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
boolean find = true;
//상하좌우 확인
for (int k = 0; k < 4; k++) {
int nx = i + dx[k];
int ny = j + dy[k];
if (nx > 0 && nx < n+1 && ny > 0 && ny < n+1) {
if (arr[i][j] <= arr[nx][ny]) {
find = false;
break;}
}
}
if (find) answer++;
}
}
System.out.println(answer);
}
}
다른 풀이
따로 0으로 이뤄진 배열을 감싸지 않고 입력받은 원소로만 이차원 배열을 구성하여 푼 코드이다
이때, 인접한 위치 인덱스 범위는 0보다 크거나 같고 n보다 작아야 한다
import java.util.Scanner;
public class Main {
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];
int ny = j + dy[k];
if(nx >= 0 && nx < n && ny >= 0 && ny < n){
if(arr[nx][ny] >= arr[i][j]){
flag = false;
break;
}
}
}
if(flag) answer++;
}
}
return answer;
}
public static void main(String[] args) {
Main T = new Main();
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.print(T.solution(n,arr));
}
}