article thumbnail image
Published 2022. 6. 7. 02:26
격자판 최대합
5*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
N*N의 격자판이 주어지면 각 행의 합, 각 열의 합, 두 대각선의 합 중 가 장 큰 합을 출력합
니다.
▣ 입력설명
첫 줄에 자연수 N이 주어진다.(1<=N<=50)
두 번째 줄부터 N줄에 걸쳐 각 줄에 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

1. 행과 열의 변수 만들고
2. for문을 활용해서 행의 합을 구한다
=> for문을 두개 사용해야함. 
3. 열의 합을 구할땐, i.j의 위치를 바꿔주면됨
4. answer에 결과 값 저장
📌작성코드
<html>

<head>
  <meta charset="UTF-8">
  <title>출력결과</title>
</head>

<body>
  <script>
    function solution(arr) {
      let answer = 0; // 결과를 저장 변수 (가장 큰 값)
      let sum1 = 0; // 행의 합을 저장 할 변수
      let sum2 = 0; // 열의 합을 저장 할 변수

      let dia1 = 0;
      let dia2 = 0;
      // 행과 열을 돌기위한 반복문
      for (let i = 0; i < arr.length; i++) {
        sum1 = 0;
        sum2 = 0;
        for (let j = 0; j < arr.length; j++) {
          sum1 = sum1 + arr[i][j] // 행을 다 돌아서 저장하려는 코드
          sum2 = sum2 + arr[j][i] // 열을 다 돌아서 저장하려는 코드

        }
        answer = Math.max(sum1, sum2, answer)
      }

      // 대각선을 돌기위한 반복문
      for (let i = 0; i < arr.length; i++) {
        dia1 = dia1 + arr[i][i]
        dia2 = dia2 + arr[i][arr.length - i - 1]
      }
      answer = Math.max(dia1, dia2, answer)
      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>
</body>

</html>
행의 합, 열의 합, 두 대각선의 합 중 가장한 큰 합을 출력하는 문제! (어렵다....)

일단 하나씩 ....
행의 합을 먼저 구해보자.
큰 배열의 10에 접근을 한다고 했을때, arr[0][0] 을 넣어줘야 10에 접근할 수 있다.
for문으로 arr[0][0], arr[0][1], arr[0][2], arr[0][3], arr[0][4]까지 
다 돌고난 다음 더한값을 sum1에 저장하고, for문안에 for문을 또 넣어서 이번엔 열의 합을 구해준다.
세로값에 접근해야하니까 
arr[0][0], arr[1][0], arr[2][0], arr[3][0], arr[4][0]가 넣어지게 되고,
합을 sum2에 저장한다.

여기서... 큰 배열을 for문으로 다돌고 합을 sum1에 저장했다.
그다음 두번째 큰 배열로 넘어가야하는데 sum1의 초기값을 0으로 바꿔주지않으면
앞에서 돌았던 큰배열의 합이 들어가버리기때문에 sum1=0으로 바꿔줘야한다.
(sum2도 마찬가지) 


그다음 sum1, sum2에 저장된 값 중 가장 큰 합은
Math.max() 메소드를 사용하여 최대 합을 구해보자.

코드에서  

answer = Math.max(sum1, sum2, answer)
 
마지막 입력값으로 answer를 넣은 이유는,
예를들어 answer= 10 sum1=5 sum2=8 이런값이 들어있다고 한다면
answer를 넣지않으면 sum1과 sum2중 큰 값은 8이고,
answer의 원래 값은 10이지만 answer에는 sum1,sum2 결과값 중 큰 수인 8이 들어가버리기때문.


마지막으로 대각선의 합을 구해보자.
우리가 원하는숫자는 10,39,50,37,19 에 접근하는 것이고,
인덱스로 나타내보면 arr[0][0] arr[1][1] arr[2][2] arr[3][3]...이런식으로 접근해야 한다.
그래서 arr[i][i]를 넣어주었다.
반대쪽 대각선의 15,23,50,27,19에 접근한다고 생각해보자, 그럼 arr[i][arr.length -i -1]을 넣어줘야
arr[0][4]가 되고 arr[1][3] arr[2][2] arr[3][1] ..... 순서대로 접근 할 수있다.

(인덱스는 0부터시작하지만 length는 1부터 시작하기때문에 마지막에 -1을 반드시 해줘야한다)

'알고리즘' 카테고리의 다른 글

[알고리즘 문제] 3-2번  (0) 2022.06.08
[알고리즘 문제] 3-1번  (0) 2022.06.08
[알고리즘 문제] 2-5번  (0) 2022.06.04
[알고리즘 문제] 2-4번  (0) 2022.06.02
[알고리즘 문제] 2-3번  (0) 2022.06.02
복사했습니다!