알고리즘/인프런

[JS] - 격자판의 최대합 구하기

미니미니찍찍 2022. 3. 15. 22:17

 

주어진 이차원 배열에서 
가로, 세로, 대각선의 합을 구해서 가장 큰 값을 출력하는 알고리즘

 

// 주어진 배열 
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],
];

주어진 배열에 가로, 세로 , 대각선의 합을 구하여서 

가장 큰 합을 구하라고 한다....

이게 도대체 무슨...????? 

 

대략 처음에 문제를 파악할 때는 일단 이중for문을 써야할 거 같다. 

 

그러면 처음에 내가 짠 코드를 보자 . 

function solution(arr){
	let answer = 0;
    let n = arr.length ;
    
    let sum = 0;
    for(let i = 0 ; i < n ; i ++){
    	for(let j = 0 ; j < n ; j ++){
        	sum += arr[i][j];
        }
    }
    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 = 0; // 행의 합을 담을 변수
  let sum2 = 0; // 열의 합을 담을 변수 
  
  // 각 행, 열
  for (let i = 0; i < n; i++) {
  	// i번째 행이 새로 돌때 마다 각 sum 변수를 초기화해주어야한다!!!!
    sum1 = 0; 
    sum2 = 0;
    for (let j = 0; j < n; j++) {
      sum1 += arr[i][j];
      sum2 += arr[j][i];
    }
    
    // 가장 큰 수를 결과값에 담는다. 
    answer = Math.max(answer, sum1, sum2);
  }
  // 대각선
  // 이때도 마찬가지로 각 sum 변수는 초기화 해준다. 
  sum1 = 0;
  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));

// 결과값
// 155

 

 

 

출처 - 인프런 자바스크립트 알고리즘 김태원님 강의

728x90
반응형