JS 알고리즘 문제풀이/섹션 2. 1, 2차원 배열 탐색

7.봉우리

crab. 2022. 1. 13. 11:31

📌강의 정리

봉우리가 되려면 12,3,6,9시가 다 나보다 낮아야 한다.

여기서 중요한점은 격자의 가장자리는 0으로 나보다 작다고 생각해야한다.

구석에 있다면 바깥쪽은 볼필요가 없다.

4방향 탐색에서 if문을 남발하지말자

1행 2열 인 '1'이 있다.

dx와 dy의 배열을 새로 만들어야 한다.

dx = [-1, 0, 1, 0]

dy = [0, 1, 0, -1]

을 하면 이 배열을 더해주고 빼면서 봉우리를 찾는 코드를 짤 수 있다.

이중 포문을 만들고 거기다 k로 k<4의 포문을 하나더 안에 만든다.

이제 제일 안에

let nx = i+dx[k]

let ny = j+dy[k]

를 하면 방향을 정할 수 있다.

또한 이 코드가 작동하기 전에 flag변수를 1로 해주고

나보다 같거나 큰애가 있다면 바로 플래그를 0으로 바꾸고 break를 걸어주면된다.

또한 조건에서 인덱스 -1로 되는 부분을 탐색하면 안되므로

nx≥0 && nx<n && ny≥0 && ny<n && 을 앞에 넣어줘야 한다.

이제 앞으로 dx,dy를 써서 상하좌우 탐색하고 flag변수를 쓰는 것을 종종 할것이다.

📌느낀점

나는 정말 극한의 하드코딩을 했는데 그래서인지 더더욱

지금까지 했던 문제들중 제일 어렵고 제일 신기하며 크게 다가왔다.

알고리즘이란 이런거구나를 깨달았고 여기서 쓰인 그 어떤 코드도 내가 모르는 코드가 없었다..

알고리즘이 점점 재밌어지는것 같다.

dx,dy와 조건들을 잘 거는 것 그리고 삼중포문 k, flag변수들을 잘 기억해둬야겠다.

// 22.06.04 추가
// 나의 코드
<html>
  <head>
    <meta charset="UTF-8" />
    <title>출력결과</title>
  </head>
  <body>
    <script>
      function solution(arr) {
        let answer = 0;
        const getVisited = (row, col) =>
          Array.from(Array(row), () => Array(col).fill(0));
        let arr2 = getVisited(arr.length + 2, arr.length + 2);
        for (let i = 0; i < arr.length; i++) {
          for (let j = 0; j < arr.length; j++) {
            arr2[i + 1][j + 1] = arr[i][j];
          }
        }
        for (let k = 1; k < arr2.length - 1; k++) {
          for (let l = 1; l < arr2.length - 1; l++) {
            if (
              arr2[k][l] > arr2[k - 1][l] &&
              arr2[k][l] > arr2[k + 1][l] &&
              arr2[k][l] > arr2[k][l - 1] &&
              arr2[k][l] > arr2[k][l + 1]
            )
              answer++;
          }
        }
        console.log(arr2);
        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>
  </body>
</html>
//나의 코드
<html>
    <head>
        <meta charset="UTF-8">
        <title>출력결과</title>
    </head>
    <body>
        <script>
            function solution(arr){  
                let answer=0;
                let n = arr.length;
                for(let i=0; i<n; i++){
                    for(let j=0; j<n; j++){
                        if(i===0){
                            if(j===0){
                                if(Math.max(arr[i][j],
                                            arr[i+1][j]) === arr[i][j]){
                                                answer++;
                                                console.log(i,j)
                                            }
                                continue;
                            }
                            else if(j===n-1){
                                if(Math.max(arr[i][j], arr[i][j-1],
                                arr[i+1][j]) === arr[i][j]){
                                                answer++;
                                                console.log(i,j)
                                            }
                                continue;
                            }
                        }
                        if(i===n-1){
                            if(j===0){
                                if(Math.max(arr[i][j], arr[i][j+1], 
                                    arr[i-1][j]) === arr[i][j]){
                                                answer++;
                                                console.log(i,j)
                                            }
                                    continue;
                            }
                            else if(j===n-1){
                                if(Math.max(arr[i][j], arr[i][j-1],
                                    arr[i-1][j]) === arr[i][j]){
                                                answer++;
                                                console.log(i,j)
                                            }
                                    continue;
                            }
                        }
                        if(i===0){
                                if(Math.max(arr[i][j], arr[i][j+1], 
                                    arr[i][j-1], arr[i+1][j]) === arr[i][j]){
                                                answer++;
                                                console.log(i,j)
                                            }
                                continue;
                            }
                        if(i===n-1){
                                if(Math.max(arr[i][j], arr[i][j-1],
                                    arr[i-1][j], arr[i][j+1]) === arr[i][j]){
                                                answer++;
                                                console.log(i,j)
                                            }
                                    continue;
                            }
                        if(j===0){
                                if(Math.max(arr[i][j], arr[i][j+1], 
                                    arr[i-1][j], arr[i+1][j]) === arr[i][j]){
                                                answer++;
                                                console.log(i,j)
                                            }
                                continue;
                            }
                        if(j===n-1){
                                if(Math.max(arr[i][j], arr[i][j-1],
                                    arr[i-1][j], arr[i+1][j]) === arr[i][j]){
                                                answer++;
                                                console.log(i,j)
                                            }
                                    continue;
                            }
                            if(Math.max(arr[i][j], arr[i][j-1], arr[i][j+1],
                                    arr[i-1][j], arr[i+1][j]) === arr[i][j]){
                                                answer++;
                                                console.log(i,j)
                                            }
                                    continue;
                    }
                }
                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>
    </body>
</html>
//강사님 코드
<html>
    <head>
        <meta charset="UTF-8">
        <title>출력결과</title>
    </head>
    <body>
        <script>
            function solution(arr){  
                let answer=0;
                let n=arr.length;
                let dx=[-1, 0, 1, 0];
                let dy=[0, 1, 0, -1];
                for(let i=0; i<n; i++){
                    for(let j=0; j<n; j++){
                        let flag=1;
                        for(let k=0; k<4; k++){
                            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>
    </body>
</html>

'JS 알고리즘 문제풀이 > 섹션 2. 1, 2차원 배열 탐색' 카테고리의 다른 글

6.격자판 최대합  (0) 2022.01.13
5.등수구하기  (0) 2022.01.12
4.점수계산  (0) 2022.01.12
3.가위바위보  (0) 2022.01.12
2.보이는 학생  (0) 2022.01.12