인프런의 자바(Java)알고리즘 문제풀이 입문:코딩테스트 대비 강좌의 문제를 풀고 문제 해설을 작성해보았습니다.
섹션2. Array(1,2차원 배열)의 10. 봉우리 강의편 입니다.
설명
지도 정보가 N*N 격자판에 주어집니다. 각 격자에는 그 지역의 높이가 쓰여있습니다.
각 격자판의 숫자 중 자신의 상하좌우 숫자보다 큰 숫자는 봉우리 지역입니다. 봉우리 지역이 몇 개 있는 지 알아내는 프로그램을 작성하세요.
격자의 가장자리는 0으로 초기화 되었다고 가정한다.
만약 N=5 이고, 격자판의 숫자가 다음과 같다면 봉우리의 개수는 10개입니다.
입력
첫 줄에 자연수 N이 주어진다.(2<=N<=50)
두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다. 각 자연수는 100을 넘지 않는다.
출력
봉우리의 개수를 출력하세요.
import java.util.Scanner;
public class 봉우리 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int [][] arrNum = new int[num+2][num+2];
//자연수 크기만큼 배열에 저장
for(int i = 1; i<num+1; i++) {
for(int j = 1; j<num+1; j++) {
arrNum[i][j] = sc.nextInt();
}
}
//격자의 가장 자리 0으로 초기화
for(int i = 0; i<num+2; i++) {
for(int j = 0; j<num+2; j++) {
if(i==0) {
arrNum[i][j] = 0;
arrNum[j][i] = 0;
}
if(i == num+1) {
arrNum[i][j] = 0;
arrNum[j][i] = 0;
}
}
}
System.out.println(solution(num, arrNum));
}
public static int solution(int num, int[][] arrNum) {
//봉우리 갯수 저장
int cnt = 0;
for(int i = 1; i<num+1; i++) {
for(int j = 1; j<num+1; j++) {
if(
(arrNum[i][j] > arrNum[i-1][j]) && //상
(arrNum[i][j] > arrNum[i][j-1]) && //좌
(arrNum[i][j] > arrNum[i][j+1]) && //우
(arrNum[i][j] > arrNum[i+1][j])) { //하
cnt++;
}
}
}
return cnt;
}
}
>> 해설
n*n 격자판의 가장 자리를 0으로 초기화 시켜주기 위해 입력 받은 num의 +2 크기 만큼의 2차원 배열을 생성한다.
1~ num+1 만큼 2차원 배열에 숫자를 입력한다.
격자판의 가장자리를 0으로 세팅한다.
격자판의 현재 위치에 있는 값이 상하좌우에 있는 값과 비교해서 큰 경우 cnt수를 늘린다.
배열의 현재 위치가 arr[i][j] 일 때
상 : arr[i-1][j] 좌 : arr[i][j-1] 우 : arr[i][j+1] 하 : arr[i+1][j]
이므로 이 배열 위치 값들보다 arr[i][j] 값이 큰지 비교한다.
'Computer Science > Algorithm' 카테고리의 다른 글
[Inflearn] 멘토링 (0) | 2023.02.04 |
---|---|
[Inflearn] 임시반장 정하기 (0) | 2023.01.03 |
[Inflearn] 격자판 최대합 (0) | 2022.12.18 |
[Inflearn] 등수구하기 (0) | 2022.12.11 |
[Inflearn] 점수계산 (0) | 2022.12.03 |