본문 바로가기
문제풀이/인프런 알고리즘 문제풀이

격자판 최대합

by dev_kong 2021. 12. 10.
728x90
728x90

문제설명

N*N크기의 표가 숫자로 채워져있다.

각 행의 합

각 열의 합

좌상우하 대각선 합

우상좌하 대각선 합 중 

가장 큰 합을 구하라.

10 13 10 12 15
12 30 30 23 11
11 25 50 53 15
19 27 29 37 27
19 13 30 13 19

 

접근방법

다행히 2차배열로 만들어서 입력해주더라..

배열 부터 만들었으면 귀찮았을거 같다.

좋은 방법이 있을까 고민을 해봤는데,

그냥 각 행의 합, 각 열의 합, 대각선 합 두개

총 12개의 숫자 다 한 배열에 때려 넣고

Math.max 돌리면 되는 거 아닌가..

function getBiggestSum(arr) {
  //모든 합이 들어가는 배열
  const sum = [];

  //가로열 합
  for (let i = 0; i < arr.length; i++) {
    sum.push(arr[i].reduce((val, cur) => val + cur, 0));
  }

  //세로열 합
  for (let i = 0; i < arr.length; i++) {
    let rowSum = 0;
    for (let j = 0; j < arr.length; j++) {
      rowSum += arr[j][i];
    }
    sum.push(rowSum);
  }

  //좌상당 대각선 합
  let diagonal1 = 0;
  for (let i = 0; i < arr.length; i++) {
    diagonal1 += arr[i][i];
  }
  sum.push(diagonal1);

  //우상단 대각선 합
  let j = 4;
  let diagonal2 = 0;
  for (let i = 0; i < arr.length; i++) {
    diagonal2 += arr[i][j];
    j -= 1;
  }
  sum.push(diagonal2);

  return Math.max(...sum);
}

..ㅎ 진짜 개무식한 방법이다..

저 대각선 합은 그렇다쳐도

왜 행과 열의 합을 구할 때 for문 한번으로 해결할 생각을 못하고

다 따로 구했을까.

이 문제 풀 때 내 머릿속은 이랬다.

다 구한다음에 한배열에 때려넣고

제일큰거 구하자 헿!

우선 행의 합은 한줄씩 reduce로 

세로는 이중for문으로

좌상우하 대각선은 [i][i]로

우상좌하 대각선은 for문 하나에 j는 1씩작아지게 하면 될듯! 헿!

 

물론 답은 나왔다.

근데 다풀고 나니까 이거 좀 아닌데 싶어서

한참 고민해봤는데 한번 머리에 저걸로 굳어지니까 다른 생각은 나질 않는다.

결국 센세의 해답을 봤다.

 

function getBiggestSum2(arr) {
  let answer = 0;
  let sum1 = 0;
  let sum2 = 0;

  for (let i = 0; i < arr.length; i++) {
    sum1 = 0;
    sum2 = 0;
    for (let j = 0; j < arr.length; j++) {
      sum1 += arr[i][j];
      sum2 += arr[j][i];
    }
    answer = Math.max(answer, sum1, sum2);
  }

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

ㅎ...

1번 for문에서  2중for문으로 행의 합과 , 열의 합을 한번에 구했다.

arr[i][j], arr[j][i]로 하면 되는데 저 생각을 아예 못했다.

그리고 여기서 answer에다가 행의 합, 열의 합중 가장 큰 수를 넣는 것도 생각 못 했다.

 

그리고 2번 for문에서는

대각선의 합을 한번에 구했다.

arr[i][i]와 arr[arr.length -1 -i] 로 훨씬 간단하게 구현했다.

 

센세의 코드와 내 코드 둘다 O(N^2)의 시간 복잡도는 같지만

코드를 봤을 때 마음의 복잡해지는건  내 코드다.

많이 연습하자..

 

728x90
728x90

'문제풀이 > 인프런 알고리즘 문제풀이' 카테고리의 다른 글

4-5 k번째 큰수  (0) 2021.12.20
4-4 졸업선물  (0) 2021.12.20
4-3 멘토링  (0) 2021.12.20
4-2 뒤집은 소수  (0) 2021.12.14
4-1 자릿수의 합  (0) 2021.12.14

댓글