HackerRank

[해커랭크] (Data Structures - Arrays) 2D array - DS; 모래시계 행렬 (javascript)

hee0 2022. 9. 5. 15:00
6x6 행렬의 배열이 주어질 때, 아래 모래시계배열의 합의 최댓값을 구하라
 a  b  c 
     d 
 e  f   g

조건

  • 입력값은 int arr[6][6] 
  • 각 배열을 순차적으로 돌면서 모래시계 배열의 합이 최댓값인 경우 반환
  • 아래 행렬이 주어진 경우, 모래시계배열은 그림 1.과 같이 표현될 수 있음
1 1 1 0 0 0
0 1 0 0 0 0
1 1 1 0 0 0
0 0 2 4 4 0
0 0 0 2 0 0
0 0 1 2 4 0

그림 1. 6x6 행렬로 부터 얻을 수 있는 모래시계 배열

제한사항

  • -9 ≤ arr[i][j] ≤ 9
  • 0 ≤ i, j ≤ 5

 

나의 풀이

  • 2중 배열을 단일 배열(const lines)로 변환하여 수행
    • n 중 배열을 단일배열화하는 법
      • arr.join(',').split(',')
  •  모래시계의 배열은 3x3 배열이므로 배열길이의 -2만큼만 반복을 수행하며 행렬을 순회
    • 3x3의 배열에서 모래시계배열 위치는 아래 그림2.와 같음
    • 즉, 행과열을 각각 한칸씩 이동하며 해당 모래시계 배열에 해당하는 인덱스에 위치한 값을 추출

그림 2. 3x3 행렬에서의 모래시계 배열 위치

  • 추출한 배열값의 합을 비교하여 최댓값을 추출
// 생략

/*
 * Complete the 'hourglassSum' function below.
 *
 * The function is expected to return an INTEGER.
 * The function accepts 2D_INTEGER_ARRAY arr as parameter.
 */

function hourglassSum(arr) {
  // Write your code here  
  const len = arr.length;
  const lines = [...arr.join(',').split(',')];
  let max = -Infinity;

  for(let j = 0; j<len-2;j++) {
    for(let i = 0; i <len-2;i++){
      const j1 = j*len;
      const j2 = (j+1)*len;
      const j3 = (j+2)*len;
      const hourglass = [lines[i+j1], lines[i+1+j1], lines[i+2+j1], lines[i+1+j2], lines[i+j3], byte[i+1+j3], byte[i+2+j3]];
      const sum = hourglass.reduce((a, b) => a += +b, 0);
      max = Math.max(max, sum);
    }
  }
    
  return max;
}

// ...후략

결과