격자판 최대합

지창언·2022년 7월 26일

codingTest

목록 보기
15/29

Index

1.문제
2.내 코드
3.발전시킨 코드


문제

N*N 격자판을 입력받고, 각 행의 합, 열의 합, 대각의 합 중 가장 큰 합을 출력하시오.


내 코드

<script>
            function solution(arr){  
                let answer = 0,sum=0,sum2=0;
                for(let i=0; i<arr.length;i++){
                    sum2 += arr[i][i];
                    // 여기는 행의 합 확인
                    sum = arr[i].reduce((acc,cur)=>{
                        acc+=cur;
                        return acc;
                    })
                    if(sum >answer) answer = sum;
                    // 아래는 열의 합 확인
                    sum = 0;
                    for(let j=0; j<arr[i].length;j++){
                        sum += arr[j][i];
                    }
                    if(sum >answer) answer = sum;
                }
                // 대각(왼위->오른아래) 합 확인
                if(sum2>answer) answer = sum2;
                sum2 = 0;
                // 대각 (오른위 -> 왼아래) 합 확인
                for(let i=arr.length-1;i>-1;i--){
                    sum2 += arr[i][4-i];
                }
                if(sum2>answer) answer = 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));
</script>

각 행의 합을 먼저 구한후, 최대값과 비교하고
다시 열의 합을 구한후 최대값과 비교,
대각 합을 또 다시 따로 구한 후 최댓값과 비교하게 된다.
중첩 for문이 2개나 존재하고,
다시 또 for문을 하나 더 쓰게 된다.
비효율적인데다가 가독성도 떨어진다. (내가 작성하고 하루뒤에 다시 봤는데, 처음부터 코드리뷰하고 있었다...)


발전시킨 코드

<script>
            function solution(arr){  
                let answer = Number.MIN_SAFE_INTEGER
                ,sum1=0,sum2=0;
                let n = arr.length;
                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));
</script>

강의를 통해 배운 코드 ..
중첩 for문도 하나로 깔끔하게 끝냈고, 가독성도 좋다.

문제가 주어지면 해결이야 어떻게든 할 수 있지만, 효율성과 가독성을 챙기려면 생각이란걸 좀 더 해야겠다 🥲 (쉽지 않지 그게)


profile
프론트엔드 개발자가 되고 싶은...

0개의 댓글