CODE KATA #19

YoungToMaturity·2021년 2월 8일
0

CODE KATA 🧗‍♂️

목록 보기
19/37
post-thumbnail

격자판 최대합

N*N의 격자판이 주어지면 각 행의 합, 각 열의 합, 두 대각선의 합 중 가 장 큰 합을 출력합니다.

나의 풀이

            function solution(arr){  
                let answer=Number.MIN_SAFE_INTEGER;
                let n=arr.length;
                let rowMax=0, colMax=0, diaMax=0, tmp;
                for(i=0; i<n; i++) {
                    tmp=0;
                    for(let x of arr[i]) {
                        tmp += x;
                    }
                    if(rowMax < tmp) rowMax=tmp;
                }
                for(i=0; i<n; i++) {
                    tmp=0;
                    for(j=0; j<n; j++) {
                        tmp += arr[j][i];
                    }
                    if(colMax < tmp) colMax=tmp;
                }
                let s=0,d=0;
                for(i=0; i<n; i++) {
                    s += arr[i][i];
                    d += arr[n-i-1][i];
                }
                diaMax = (s > d ? s : d);
                answer = Math.max(rowMax,colMax,diaMax);
                return answer;
            }

            let arr=[[10, 13, 10, 12, 15], 
                     [12, 39, 30, 23, 11],
                     [11, 25, 50, 53, 15],
                     [19, 27, 29, 37, 27],
                     [19, 13, 30, 13, 19]];
            console.log(solution(arr));

정답 풀이

            function solution(arr){  
                let answer=Number.MIN_SAFE_INTEGER;
                let n=arr.length;
                let sum1=sum2=0;
                for(let i=0; i<n; i++){
                    sum1=sum2=0;
                    for(let j=0; j<n; j++){
                        sum1+=arr[i][j];
                        sum2+=arr[j][i];
                    }
                    answer=Math.max(answer, sum1, sum2);
                }
                sum1=sum2=0;
                for(let i=0; i<n; i++){
                    sum1+=arr[i][i];
                    sum2+=arr[i][n-i-1];
                }  
                answer=Math.max(answer, sum1, sum2); 
                return answer;
            }

            let arr=[[10, 13, 10, 12, 15], 
                     [12, 39, 30, 23, 11],
                     [11, 25, 50, 53, 15],
                     [19, 27, 29, 37, 27],
                     [19, 13, 30, 13, 19]];
            console.log(solution(arr));

배울 점

나의 풀이의 경우 rowMaxcolMax를 통해 각각 for문을 통해서 2번 반복하여 행의 최댓값과 열의 최댓값을 구했는데 반해, 정답 풀이의 경우, for문의 중첩을 이용한 것 까지는 나의 풀이와 동일하지만, arr[i][j]arr[j][i]를 사용하여 한번에 행과 열의 합을 구하고, 반복을 통해 Math.Max(answer,sum1,sum2)중 가장 큰 값을 매 반복 갱신해주도록 하였다. 이 또한 나의 경우는 행을 각각 비교, 열을 각각 비교한 후 마지막에 최댓값을 계산해준 것에 비해 훨씬 효율적이고 가독성이 좋은 코드이다.

봉우리

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

나의 풀이

            function solution(arr){  
                let answer=0;
                let n=arr.length;
                for(i=0; i<n; i++) {
                    for (j=0; j<n; j++) {
                        let isPeak = true;
                        if(i !== 0) {
                            if(arr[i][j] <= arr[i-1][j]) isPeak = false;
                        }
                        if(i !== n-1) {
                            if(arr[i][j] <= arr[i+1][j]) isPeak = false;
                        }
                        if(j !== 0) {
                            if(arr[i][j] <= arr[i][j-1]) isPeak = false;
                        }
                        if(j !== n-1) {
                            if(arr[i][j] <= arr[i][j+1]) isPeak = false;
                        }
                        if(isPeak) 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));

정답 풀이

            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));

배울 점

나의 풀이의 경우 if문의 중첩을 4번 반복하여 상하좌우의 사례를 확인했으나, 정답 풀이의 경우는 let dx=[-1, 0, 1, 0];let dy=[0, 1, 0, -1];를 통해서 상하좌우의 경우를 지정하고, k를 포함한 for문으로 나의 풀이의 4개의 if문을 하나의 if문으로 통합시켰다.

고민해볼 점

우아한 테크코스의 후기를 통해 알게된 점인데, 코드 과제의 indent(깊이)를 3으로 제한하는 조건이 주어지곤 한다고 한다. 그렇다면 내 풀이와 정답 풀이의 경우는 indent가 4인 경우로 추정되는데, 해당 문제를 indent를 3으로 제한 할 경우 어떻게 해야 문제를 해결할 수 있을까?

profile
iOS Developer

0개의 댓글