far

[JS 알고리즘] 격자판 최대합 본문

알고리즘/알고리즘 베이스

[JS 알고리즘] 격자판 최대합

Eater 2023. 3. 22. 17:59

격자판 최대합

5*5 격자판에 아래와 같이 숫자가 적혀있습니다.

N*N의 격자판이 주어지면 각 행의 합, 각 열의 합, 두 대각선의 합 중 가 장 큰 합을 출력합니다.

 

입력설명
첫 줄에 자연수 N이 주어진다.(1<=N<=50) 두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다. 각 자연수는 100을 넘지 않는다.

출력설명
최대합을 출력합니다.

입력예제
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

출력예제
155

 

// 나의 풀이

function solution(arr){  
    let answer = 0
    let cross = 0
    let cross2 = 0
    let tmp = 0
    let tmp2 = 0
    let jminus = 4
    for(let i = 0; arr.length > i; i++) {
        for(let j = 0; arr.length > j; j++) {
            tmp += arr[i][j]
            tmp2 += arr[j][i]
            if (i === j) {
               cross += arr[i][j] 
            } // [i][i]로 가능 (따로 for문 한번 더 돌려서)
            if (j === jminus) {
                cross2 += arr[i][j]
            } // arr[i][arr.length-i-1]

        }
        if (tmp > answer) {
            answer = tmp
        }
        if (tmp2 > answer) {
            answer = tmp2
        }
        if (cross > answer) {
            answer = cross
        }
        if (cross2 > answer) {
            answer = cross2
        }
        // answer=Math.max(answer, tmp, tmp2, cross, cross2); 이렇게 가능
        tmp = 0
        tmp2 = 0
        jminus--
    }
    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));

arr[i][i]라는 방식도 생각 못했고, for문을 두 번 쓴다는 생각을 못해서 하드코딩으로 작성된 코드. 그리고 Math.max를 활용했다면 if문을 도배할 필요도 없었을텐데..

// 강의의 풀이

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;
}

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));

Math.max의 사용과 arr[i][i]의 사용으로 변수도 줄고 식이 깔끔하다.

Number.MIN_SAFE_INTEGER는 자바스크립트의 최소 정수값을 나타낸다.

'알고리즘 > 알고리즘 베이스' 카테고리의 다른 글

[JS 알고리즘] 회문 문자열  (0) 2023.03.25
[JS 알고리즘] 봉우리  (0) 2023.03.22
[JS 알고리즘] 등수 구하기  (0) 2023.03.22
[JS 알고리즘] 점수계산  (0) 2023.03.22
[JS 알고리즘] 보이는 학생  (0) 2023.03.22
Comments