[백준 알고리즘] Node.js 2740. 행렬 곱셈
2023. 6. 7. 14:04ㆍ코딩연습
1. 문제
https://www.acmicpc.net/problem/2740
2740번: 행렬 곱셈
첫째 줄에 행렬 A의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 순서대로 주어진다. 그 다음 줄에는 행렬 B의 크기 M과 K가 주어진다. 이어서 M개의 줄에 행렬 B의 원소 K개
www.acmicpc.net
2. 풀이
- 행렬의 곱셈을 이용한 문제이다.
- 행렬의 곱셈 관련된 부분은 아래의 페이지를 참고했다.
- 처음 나의 풀이 : 결과 - 출력 초과
const inputs = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
const [an,am] = inputs.shift().split(' ').map(v => +v);
const aArr = inputs.splice(0,an).map(v => v.split(' ').map(Number));
const [bm,bk] = inputs.shift().trim().split(' ').map(v => +v);
const bArr = inputs.splice(0,bm).map(v => v.split(' ').map(Number))
const total = Array.from({length : an}, () => new Array(bk).fill(0));
const recursive = (y,x) => {
if(x >= bk) return;
while(y < an){
for(let i = 0; i < am; i++){
console.log(y, x, aArr[y][i], bArr[i][x])
total[y][x] += aArr[y][i] * bArr[i][x];
}
y++;
}
recursive(0, x+1)
}
recursive(0,0)
const answer = total.map(v => v.join(' ')).join('\n')
console.log(answer)
- vscode에서 작성하였을 때 주어진 테스트 케이스는 문제없이 통과했지만 제출하였을 때 출력 초과가 발생하였다.
- 다른 사람의 풀이 : https://lhoiktiv.tistory.com/384
const fs = require('fs');
const input = fs.readFileSync("./dev/stdin").toString().trim().split("\n").map(v=>v.split(' ').map(x=>+x));
const A=[]; //첫번째 행렬
const B=[]; // 두번째 행렬
const C =[]; // 계산하기 좋게 두번째 행렬을 바꿔서 만들 행렬
//첫번째 행렬 정리
const [N,M] = input.shift();
for(let i = 0; i<N; i++){
A.push(input.shift());
}
//두번째 행렬 정리
const [K,L] = input.shift();
for(let i = 0; i<K; i++){
B.push(input.shift());
}
//두번째 행렬 수정
while(B[0].length>0){
const temp = [];
for(let i = 0; i<K;i++){
temp.push(B[i].shift())
}
C.push(temp)
}
// 행렬의 곱셈
const answer = [];
for(let i = 0; i<N; i++){
answer.push([])
const X = A[i];
for(let j = 0; j<L; j++){
let sum = 0;
const Y = C[j]
for(let k = 0; k<K; k++){
sum+=X[k]*Y[k];
}
answer[answer.length-1].push(sum)
}
}
const result = answer.map(v=>v.join(' ')).join('\n')
console.log(result)
3. 정리
- 내 풀이는 주어진 조건과 짧은 테스트 케이스의 경우에는 통과하는 것 같다.
- 크기가 큰 행렬의 경우에 출력 초과가 발생하는 것 같은데.... 재귀를 사용해서 그런건가 정확한 이유를 모르겠다.
나중에 다시 풀어봐야겠다.
'코딩연습' 카테고리의 다른 글
[백준 알고리즘] Node.js 24444. 알고리즘 수업 - 너비 우선 탐색 1 (0) | 2023.06.15 |
---|---|
[백준 알고리즘] Node.js 2805. 나무 자르기 (0) | 2023.06.09 |
[백준 알고리즘] Node.js 11047. 동전 0 (0) | 2023.06.05 |
[백준 알고리즘] Node.js 11399. ATM (0) | 2023.06.05 |
[백준 알고리즘] Node.js 11659. 구간 합 구하기 4 (0) | 2023.06.03 |