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문도 하나로 깔끔하게 끝냈고, 가독성도 좋다.
문제가 주어지면 해결이야 어떻게든 할 수 있지만, 효율성과 가독성을 챙기려면 생각이란걸 좀 더 해야겠다 🥲 (쉽지 않지 그게)