[アルゴリズム]メッシュの最大化



グリッドの最大値と


5*5グリッドボードの数字は次のとおりです.

N*Nのメッシュボードは、各行の和、各列の和、2対角線の和の最大和を出力します.
はい.
■説明の入力
最初の行は自然数Nを与える.(1<=N<=50)2行目から、行ごとにN個の自然数がある.各自然数は100を超えない.
■出力説明
最大和を出力します.
■入力例1
5
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
■出力例1
155
対角線の和、各行の和、各列の和の最大和をそれぞれ求め、この3つの値の最大和と後出力を求めることができます.

説明する

function solution(arr) {
        let answer,
          rowSum,
          columnSum,
          crossSum,
          tempSum1,
          tempSum2 = 0;

        // rowSum 구하기
        arr.forEach((arrItem) => {
          rowSum < arrItem.reduce((acc, cur) => acc + cur)
            ? (rowSum = arrItem.reduce((acc, cur) => acc + cur))
            : null;
        });
        // columnSum 구하기
        for (let i = 0; i < arr.length; i++) {
          let tempSum = 0;
          for (let j = 0; j < arr.length; j++) {
            tempSum += arr[j][i];
            columnSum < tempSum ? (columnSum = tempSum) : null;
          }
        }
        // crossSum 구하기
        for (let i = 0; i < arr.length; i++) {
          tempSum1 += arr[i][i];
          tempSum2 += arr[arr.length - i - 1][arr.length - i - 1];
        }
        tempSum1 > tempSum2 ? (crossSum = tempSum1) : (crossSum = tempSum2);

        rowSum > columnSum ? (answer = rowSum) : (answer = columnSum);
        crossSum > answer ? (answer = crossSum) : null;
        return answer;
}
ちょっと複雑に見えますが、この方法以外は思い出せません.이중 for문と書きたくなくてもがく.

講師の説明

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;
            }
ああああMath.max!まずコード数が私よりずっと短いです.行と列の和を一式で求める.それでいいと思ったのに.

別の解釈

function solution(n, arr) {
  let row = (column = normal = reverse = 0);
 
  // row
  for (let i = 0; i < n; i++) {
    let rowSum = arr[i].reduce((acc, cur) => acc + cur, 0);
    row = Math.max(row, rowSum);
  }
 
  // column
  for (let i = 0; i < n; i++) {
    let columnSum = 0;
    for (let j = 0; j < n; j++) {
      columnSum += arr[j][i];
    }
    column = Math.max(column, columnSum);
  }
 
  // diagonal
  for (let i = 0; i < n; i++) {
    normal += arr[i][i];
    reverse += arr[i][n-i-1];
  }
 
  return Math.max(row, column, normal, reverse);
}
私の説明と同じです.最後にMath.maxを用いて一括比較を行った.私は3つの演算子を乱発しすぎた.