[js] 이차원 배열 대각선 순회하기

sookyoung.k·2024년 6월 5일
1
post-thumbnail

2차원 정수 배열 board와 정수 k가 주어집니다.

i + j <= k를 만족하는 모든 (i, j)에 대한 board[i][j]의 합을 return 하는 solution 함수를 완성해 주세요.

제한사항

  • 1 ≤ board의 길이 ≤ 100
  • 1 ≤ board[i]의 길이 ≤ 100
    • 1 ≤ board[i][j] ≤ 10,000
    • 모든 board[i]의 길이는 같습니다.
  • 0 ≤ k < board의 길이 + board[i]의 길이

나의 풀이

function solution(board, k) {
    let answer = 0;
    for (let i=0; i<board.length; i++) {
        for (let j=0; j<board[i].length; j++) {
            if(i + j <= k) answer += board[i][j]
        }
    }
    return answer;
}

아 고민 엄청 해봤는데... 걍 이중 포문 갈긴다. 댁알이가 너무 아팠다.

  • answer 변수를 0으로 초기화를 한다. i + j 가 k 이하인 모든 좌표의 board[i][j] 값의 합이 저장될 것이다.
  • 첫 번째 for문은 board를 순환한다. 두 번째 for문은 board 내부의 배열(내부 배열의 길이는 모두 같다.)을 순환한다.
  • if문으로 조건을 준 후 합을 더한다. 각 좌표 (i, j)에 대해 값이 k이 이하인 경우에만 answer에 board[i][j] 값을 더한다. 이를 반환한다.

처음에 문제 조건을 이상하게 보는 바람에 테스트 코드만 통과하고 한참 낑낑댔다. 문제를 잘 읽자...

다른 풀이 1

function solution(board, k) {
  return board.reduce(
    (total, row, i) => total + row.reduce((prev, num, j) => (i + j <= k ? prev + num : prev), 0),
    0,
  );
}

리듀스 중첩...! 리듀스 여왕 Y언니는 왠지 이렇게 풀었을 것 같다는 생각이 든다 ㅎㅎ

  • board.reduce() 메서드를 사용하여 2차원 배열 전체를 순환한다.
    • 첫 번째 인수 total은 누적 합계를 저장한다.
    • row는 현재 처리 중인 행 배열이다.
    • i는 현재 처리 중인 행의 인덱스이다.
  • 각 행 row에 대해서 reduce() 메서드를 사용하여 해당 행의 요소를 순회한다.
    • prev는 누적 합계를 저장한다.
    • num은 현재 처리 중인 요소이다.
    • j는 현재 처리 중인 열 인덱스이다.
  • 각 요소 num에 대하여 i + j <= k 조건을 확인한다.
    • true일 경우 prev + num을 반환하여 누적 합계에 더한다.
    • false일 경우 prev를 반환하여 눚거 합계에 변화가 없도록 한다.
  • reduce를 중첩으로 사용하여 모든 행과 열을 순회한 후 최종 누적 합계인 total을 반환한다.

와우.. reduce()를 중첩하면 2중 for문을 대체할 수 있다! 이런 방식을 잘 공부해두어야겠다.
2차원 배열을 순회할 때는 reduce() 메서드를 중첩해서 사용하는 것이 효과적이다!

다른 풀이 2

function solution(board, k) {
  let answer = 0;
  for (let x = 0; x < board.length; x++) {
    for (let y = 0; y < board[0].length; y++) {
      if (x + y <= k) answer += board[x][y];
    }
  }
  return answer;
}
profile
영차영차 😎

0개의 댓글