구글링을 한 것이 너의 실력은 아니야, 다시하면 안보고 풀 수 있니? 시리즈
프로그래머스, 행렬의 덧셈
이전의 풀이에서는 map을 두번 사용해서 풀이를 했다. 그런데 한번에 풀 수 있을까? 도전을 해보고자 했지만 실패했다. 그래서 매니저님의 도움을 기반으로 재귀함수라는 영역에 들어섰다.
재귀함수란?
소크라톤의 개발 블로그
소크라톤을 기반으로 위의 문제에 다시 접근해보면 아래와 같다. 먼저 위의 문제를 풀이한 풀 코드를 아래에 기록한다.
입출력의 예
function solution(arr1, arr2) {
return arr1.map((el, i) => {
return typeof el == 'object' ? solution(el, arr2[i]) : el + arr2[i]
})
}
map() 메서드에 의해서 arr1배열의 요소들이 순회된다. 이때, 반환되는 값이 세밀하게 설정되어 있는데 조건부 삼항 연산자로 기록되어 해당 배열을 제어한다.
return typeof el == 'object'
- 첫번째, arr1의 map 메서드가 실행되면, 매개변수 el이 arr1에서 [1,2]를, arr2[2,3]을 가져온다. 이때 해당 인수들은 object이다. 조건부 삼항 연산자에서 true 임으로 기록에 따라서 재귀함수가 호출된다.
(1) 재귀함수된 arr1에서 [1,2]와 arr2[2,3]는 해당 배열의 요소를 순차적으로 매개변수로 전달한다. (1)를 살펴보면 arr1[0][0]인 1과 arr2[0][0]인 3가 들어온다. 해당 요소들이 Number 이기 때문에 조건부 삼항 연산자에서 false가 되어 2번째 return으로 넘어간다. 설정에 따라서 arr1[0][0]인 2과 arr2[0][0]인 4를 반환한다.
(2) 다음으로는 arr1[0][1]인 2과 arr2[0][1]인 3이 계산되며 반환하고 해당 배열의 작업이 마무리 되기에 map메소드는 종료되며, (1)~(2)의 결과인 [4,6] 이 반환된다. >
- 이제 다시 돌아가서 arr1의 두번째 인자인 [2,3] 이 위의 작업을 동일하게 순회하는데 arr2의 두번째 인자인 [5,6]을 (1)~(2)의 과정을 거치며 결과값인 [7,9]가 반환된다.
- 최종적으로 retuen [4,6] , [7,9] 가 배열에 담겨지며, [[4,6] , [7,9]] 가 반환된다. 왜 결과들이 배열안에 담겨져서 반환될까? 처음 시작이 배열이기 때문이다.