2차원 정수 배열 board와 정수 k가 주어집니다.
i + j <= k를 만족하는 모든 (i, j)에 대한 board[i][j]의 합을 return 하는 solution 함수를 완성해 주세요.
제한사항
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;
}
아 고민 엄청 해봤는데... 걍 이중 포문 갈긴다. 댁알이가 너무 아팠다.
board
를 순환한다. 두 번째 for문은 board
내부의 배열(내부 배열의 길이는 모두 같다.)을 순환한다. i, j
)에 대해 값이 k이 이하인 경우에만 answer에 board[i][j] 값을 더한다. 이를 반환한다. 처음에 문제 조건을 이상하게 보는 바람에 테스트 코드만 통과하고 한참 낑낑댔다. 문제를 잘 읽자...
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
를 반환하여 눚거 합계에 변화가 없도록 한다. total
을 반환한다. 와우.. reduce()를 중첩하면 2중 for문을 대체할 수 있다! 이런 방식을 잘 공부해두어야겠다.
2차원 배열을 순회할 때는 reduce()
메서드를 중첩해서 사용하는 것이 효과적이다!
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;
}