문제
- 지도 정보가 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) 알고리즘 문제풀이 : 코딩테스트 대비(김태원)강의를 참고하여 작성하였습니다.
'알고리즘 > 인프런' 카테고리의 다른 글
섹션 2. Array(1, 2차원 배열)_12. 멘토링 (0) | 2022.09.22 |
---|---|
섹션 2. Array(1, 2차원 배열)_11. 임시반장 정하기 (0) | 2022.09.22 |
섹션 2. Array(1, 2차원 배열)_9. 격자판 최대합 (2) | 2022.09.21 |
섹션 2. Array(1, 2차원 배열)_8. 등수 구하기 (0) | 2022.09.20 |
섹션 2. Array(1, 2차원 배열)_7. 점수계산 (0) | 2022.09.19 |