프로그래머스 코딩테스트 레벨 1 - 행렬의 덧셈 풀이 해석 및 답안 [자바스크립트]
https://school.programmers.co.kr/learn/courses/30/lessons/12950
문제
행과 열이 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 값을 구하는 문제.
행렬에 대한 기본적인 이해가 필요하다. 고등학교 수학 맨 첫 단원에서 배우는 것으로 기억하는데(내 기억이 맞다면) 지금 와서 떠올리려고 하니까 기억이 가물가물하다.
간단하게 짚어보면 행렬은 수를 행(Row)과 열(Column)에 맞춰서 직사각형의 모양으로 순서있게 배열하여 괄호([])로 묶은 것이다.
코딩 테스트에서는 이 행렬을 2차원 배열로 행과 열을 각각 표현한다.
예를 들면,
[[1,2],
[3,4]]
이런 모양의 행렬 arr1이 주어질 때 2차원 배열 arr1[i][j] 의 형태로 행렬의 각 값에 접근할 수 있다.
제한조건
주어진 두 행렬의 행과 열의 길이는 500을 넘지 않는다.
성능 면에서 신경써서 코딩을 한 부분은 없었다.
왜냐하면 단순 이중 for문을 사용해서 문제를 해결했음에도 통과할 수 있었기 때문이다.
답
function solution(arr1, arr2) {
var answer = []; //행들의 합을 모아놓을 배열 변수
for(let i=0;i<arr1.length;i++) {
let sum = []; //각 행들에 속한 열의 합을 모아놓을 배열 변수
for(let j=0;j<arr1[i].length;j++) {
sum.push(arr1[i][j] + arr2[i][j]); //열 순서대로 원소들을 합한 뒤 push해준다.
}
answer.push(sum); //합한 원소들을 행 순서대로 push해준다.
}
return answer;
}
처음 문제를 접했을 땐 행렬에 대한 개념이 가물가물해서인지 굉장히 헷갈렸던 기억이 있다.
먼저 행의 길이만큼 for문을 돌린 뒤 각 행에 속한 열들의 합을 저장할 변수 sum을 선언한다. 그리고 각 행의 열의 길이(arr1.length)만큼 for문을 돌려서 sum에 열의 합들을 저장해준다.
마지막으로 sum을 행 순서대로 answer에 push해주면 된다.
필자와 같이 코테 초보자임에도 불구하고 위 문제를 쉽게 풀었다면 이과이거나 고등학교 수학 과목을 열심히 참여하였다는 뜻이니 자기 자신을 칭찬해주자.(?)
다른 사람의 풀이
이중 for문 대신 map() 함수를 두번 사용해서 풀 수도 있다는 사실을 알았다.
A.map((arr1, idx1) => arr1.map((val, idx2) => val+B[idx1][idx2]));
//A와 B는 두 행렬을 뜻함
대충 이런 식인데, 행을 기준으로한 map()함수로 각 행의 열들의 배열인 arr1과 인덱스 i를 구하고 배열 arr1을 다시 map()함수를 사용하여 각 열들의 값 val과 인덱스 j를 구한다. 각 열들의 합은 val(첫번째 배열 원소들의 값)과 인덱스 i와 j를 사용하여 두번째 배열 원소들의 값을 알아낸 뒤 합하면 된다.
map()함수에 대한 이해도가 있다면 for문의 대안으로 사용할 수 있지 않았을까.