Algorithm
[CodeKata] 프로그래머스 : 3.13(토), 피보나치 수 & 행렬의 곱셈
ttaeng_99
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의 행 인덱스로 이를 적용한 모습이다.
반응형