2022/01/03) 7. 봉우리 [1,2차원 탐색]

굥굥이·2022년 1월 3일
0
post-thumbnail

1. 문제

<봉우리>
: 각 격자에는 그 지역의 높이가 쓰여있다. 각 격자판의 숫자 중 자신의 상하좌우 숫자보다 큰 숫자는 봉우리 지역이다. 봉우리 지역이 몇 개 있는 지 알아내는 프로그램을 작성한다.
격자의 가장자리는 0으로 초기화 되었다고 가정한다.
위와 같은 값이 주어진다면, 봉우리는 10개다.

2. 해결 방법

  1. 현재의 위치를 기준으로, 상하좌우를 비교해야 하는 게 핵심이다.
    arr[i][j]를 기준으로, arr[nx][ny](상하좌우)를 비교하여 보자.
  2. arr[nx][ny]의 값들을, 주는 방법은 dx와 dy배열을 생성 후, nx = i+dx[k]하면 된다.
  3. 그리하여 3개의 for문과 가장 큰 봉우리를 찾는 if문을 생성한다.
    (nx>=0 && nx<n은 격자판의 가에 위치한 것들 때문에 주는 조건이다.)
  4. 정리하자면, 4방향 다 비교해보고 큰 게 없으면, 곧 제일 크면 카운트 해주는 것이다.

3. 정답

<script>
            function solution(arr){  
                //상하좌우비교하여 제일 큰 숫자만 출력. => 4방향 다 비교해보고 큰 게 없으면 카운팅을 한다.
                let answer = 0;
                let n = arr.length;
                let dx = [0,1,0,-1];
                let dy = [-1,0,1,0];
                for(let i = 0; i < n; i++){
                    for(let j = 0; j < n; j++){
                        let flag = 1; 
                        for(let k=0; k<4; k++){ //dx dy를 돌릴 for문
                            let nx=i+dx[k];
                            let ny=j+dy[k];
                                if(nx>=0 && nx < n && ny>=0 && ny < n && arr[nx][ny] >= arr[i][j] ){
                                    flag = 0;
                                    break;
                                }
                        }
                        if(flag){
                            answer++;
                        }
                    }
                }
                return answer;
            }
            let arr=[[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]];
            console.log(solution(arr));
        </script>

4. 내 코드와 비교 그리고 반성

이번에 내가 정말 좋아하는 모누가 며칠 동안 놀러 왔었다. 그 핑계로 공부를.... ㅜ 죄송합니다... 그리고 이번 문제가 2차원 문제라곤 생각하지 못했었다. 아직 2차원을 완전히 이해하진 못했나보다. 이번엔 좀 어려웠다. x y 방향은 헷갈리지 않는다. 다만 가에 있는 것들때문에 주는 조건이 아직 이해가 잘.. 다음 날에 한 번 더 해보니까 이해 완료.다만 nx에 i를 더해줄 지, j를 더해줄 지에 대한 고민을 하였는데, i는 가로를 담당하고 j는 세로를 담당하므로, i를 더해주는 게 정답이었따!

profile
아자아자 파이띵굥!

0개의 댓글