-
[CodeKata] 프로그래머스 : 3.13(토), 피보나치 수 & 행렬의 곱셈Algorithm 2021. 3. 13. 13:37반응형
🥋 Ooooth!! (Level 2)
🧮 풀이
function solution(n) { let pre = 0; let cur = 1; let last = 0; for (let i = 2 ; i <= n ; i++) { last = (pre + cur) % 1234567; pre = cur; cur = last; } return last; }
- 피보나치 수는 i번째 수가 i-1번째와 i-2번째의 합인 수이다. pre(0번째) = 0, cur(1번째) = 1 를 먼저 초기 설정해준다.
- for문을 순회하며 last에 피보나치 수를 누적한다. n번째 피보나치 수를 구해야하며, 0번째부터 시작했으므로 종료조건은 n까지이다.
- 본래는 (pre + cur) 를 누적해야하나, 이번 문제는 1234567로 나눈 나머지를 누적한다.
- 그 다음에, i-1, i-2번째를 관리하기 위해 pre와 cur를 각각 cur과 last로 최신화해주면 된다.
🥋 Ooooth!! (Level 2)
🧮 풀이
function solution(arr1, arr2) { const ansX = arr1.length; const ansY = arr2[0].length; const ansLen = arr2.length; let answer = Array.from({ length: ansX }, (x => Array.from({ length: ansY }, y => 0))) for (let x = 0 ; x < ansX ; x++) { for (let y = 0 ; y < ansY ; y++) { for (let l = 0 ; l < ansLen ; l++) { answer[x][y] += arr1[x][l] * arr2[l][y] } } } return answer; }
- 중학교땐가... 배웠던 행렬의 곱셈의 기억을 더듬어보았다 ㅎㅎㅎㅎ 🤔
- (4x2) * (2x4) 행렬의 곱셈을 예로 들면, 앞의 열과 뒤의 행의 길이가 같아야하며(2), 결과값은 앞의 행과 뒤의 열이 된다.(4x4)
- 즉, ansX, ansY는 결과값의 행과 열 길이이며, ansLen은 같은 값이자 곱셈을 반복하게되는 횟수이다.
- 이를 통해, answer 정답 이차원 배열의 사이즈를 미리 ansX * ansY 로 설정할 수 있다. (값을 더해주기 위해 0으로 초기세팅)
- 먼저, ansX, ansY를 순회하며 answer 배열의 각 인자에 위치한다.
- 현재 위치에서 ansLen만큼 더해주는데, arr1에선 행 인덱스를, arr2에선 열 인덱스를 고정하고 l만큼 순회한다.
🖇 리뷰
function solution(arr1, arr2) { return arr1.map((row) => arr2[0].map((x,y) => row.reduce((a,b,c) => a + b * arr2[c][y], 0))) }
* 출처 : 프로그래머스 다른 사람의 풀이
참 세상엔 대단하신 분들이 많다...
arr1을 map하면 행 길이만큼, arr2[0]를 map하여 열 길이만큼 순회를 했다.
row는 arr1의 각 행이 될 것이며, 이를 해당하는 arr2과의 곱의 누적값으로 reduce 처리한 것이다.
reduce의 인자들에서 a는 누적값, b는 현재값(arr1)이며 c가 인덱스이므로 arr2의 행 인덱스로 이를 적용한 모습이다.
반응형'Algorithm' 카테고리의 다른 글
[CodeKata] 프로그래머스 : 3.18(목), 배달 / [이론] Dijkstra Algorithm (0) 2021.03.18 [CodeKata] 프로그래머스 : 3.17(수), 짝지어 제거하기 (0) 2021.03.17 [CodeKata] 프로그래머스 : 3.11(목), 최대값과 최소값 & 최소값 만들기 (0) 2021.03.11 [CodeKata] 프로그래머스 : 3.10(수), 이진 변환 반복하기 (0) 2021.03.10 [CodeKata] 프로그래머스 : 3.9(화), 숫자의 표현 (0) 2021.03.09