본문 바로가기

알고리즘/인프런

섹션 2. Array(1, 2차원 배열)_10. 봉우리

문제

  • 지도 정보가 N*N 격자판에 주어집니다. 각 격자에는 그 지역의 높이가 쓰여있습니다.
  • 각 격자판의 숫자 중 자신의 상하좌우 숫자보다 큰 숫자는 봉우리 지역입니다. 봉우리 지역이 몇 개 있는 지 알아내는 프로그램을 작성하세요.
  • 격자의 가장자리는 0으로 초기화 되었다고 가정한다.
  • 만약 N=5 이고, 격자판의 숫자가 다음과 같다면 봉우리의 개수는 10개입니다.

입력

  • 첫 줄에 자연수 N이 주어진다.(2<=N<=50)
  • 두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다. 각 자연수는 100을 넘지 않는다.

출력

  • 봉우리의 개수를 출력하세요.

입출력 예제


풀이 방식을 정리해보자.

 

1. 자연수 N과 N 개수만큼의 2차원 배열 arr[ ][ ] 을 생성한다.

  • N * N 은 즉 2차원 배열을 의미한다.

2. for문을 통해 배열에 값을 넣는다.

 

3. dx[ ] 와 dy[ ] 배열을 전역으로 선언해주고 메소드를 구현하자.

  • dx[ ] 와 dy[ ] 는 상하좌우 값을 찾기 위한 배열이다.

4. 결과값을 저장할 변수 result 를 선언한다.

 

5.  0부터 N까지 도는 for문을 2개 작성한다.

  • 2 차원 배열이기 때문에 기본적으로 i / j 2개를 작성해서 행과 열을 탐색한다.

6. 두번째 for문 ( j ) 안에 boolean으로 flag 변수를 선언하고, true로 초기화한다.

  • flag : 봉우리인지 아닌지를 확인하기 위한 변수이다.

7. 그 안에 0부터 4 이전까지 도는 세번째 for문을 작성한다.

  •  for문 ( k )는 4가지의 방향을 찾기 위해 도는 것이기에 4번만 돌린다.

8. x는 행, y는 열로 각각의 좌표 값을 설정한다.

  • x : 행은 고정되고 좌우로 값을 탐색한다.
  • y : 열은 고정되고 상하로 값을 탐색한다.

9. 봉우리 여부를 확인하기 위해 arr[ x ][ y ] >= arr[ i ][ j ] 조건을 작성한다.

  • arr[x][y] : 4 방향의 값
  • arr[i][j] : 기준 값
  • 만약 4방향 중에 어떤 값이 기준 값보다 크다면 봉우리가 아니다.

10. 단, N*N 외에 밖의 값을 참조하게 되면 ArrayIndexOutOfBoundsException 에러가 발생하므로 추가 조건이 필요하다.

  • x,y가 N*N 범위를 벗어나지 않아야 하기 때문에 0과 N 을 벗어나지 않도록 조건을 추가한다.
  • 단, 이 조건이 arr[][] 보다 뒤로 들어가면 이미 참조를 한 후에 해당 조건이 들어가기 때문에 오류가 여전히 발생한다.
  • 그러므로 반드시 앞에 적어서 먼저 벗어나지 않게 처리하고, 배열 조건에 참조한다.

11. 이 조건에 맞는다면 봉우리가 아니므로 false를 출력하고, 더 탐색할 필요가 없기에 break로 막아준다.

 

12. for문( k ) 을 돌고 난 후에 flag가 true 라면 봉우리라는 의미이므로 결과값을 더해준다.

  • 4방향이 모두 기준값보다 작으면 기준값이 봉우리이기 때문이다.

수행 결과를 확인한다.


해당 글은 인프런 > 자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비(김태원)강의를 참고하여 작성하였습니다.