Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 컴퓨터과학
- Javascript
- nodejs
- CSS
- 부트캠프
- CS
- LinkSnap
- 너비우선탐색
- 자바스크립트
- computerscience
- 국비지원취업
- 프론트엔드개발자
- 백준
- cpu
- 그리디
- 컴퓨터공학
- 국비지원
- KAKAO
- 호이스팅
- DFS
- BFS
- html/css/js
- 패스트캠퍼스
- git
- 알고리즘
- js
- 야놀자
- github
- 코딩테스트
- 코테
Archives
- Today
- Total
My Boundary As Much As I Experienced
행렬 곱셈(백준 2740번, 수학/구현, NodeJS풀이) 본문
https://www.acmicpc.net/problem/2740
문제 수준:
실버5
문제 요약:
행렬 A와 B가 주어졌을 때 행렬곱셈 값을 구하여라.
입출력 예 (입력 / 출력):
문제 풀이 전략:
행렬과 행렬의 곱셈을 어떻게 구하는지 몰라서 일단 아래 블로그와 영상을 참고했다.
수1에 나오는 내용이라고 한다. 지금 중등 수학 복습 중인데 조만간 따라잡아야겠다.
참고한 블로그:
https://blog.naver.com/cindyvelyn/222136360080
참고한 영상:
https://www.youtube.com/watch?v=JpSe38UHaos
일단 입력값이 조금 불친절하다.
행렬에 대한 메타데이터 형식이 실제데이터와 동일할 가능성이 있기 때문이다.
그래서 메타데이터의 문자열만 집어내서 이를 기준으로 파싱하는 것이 까다로웠다.
//2740 행렬 곱셈
let fs = require("fs");
let input = fs.readFileSync("input.txt").toString().trim().split("\n");
let tcs = []; // testCases
for (let i = 0; i < input.length; i++) {
const [Y, X] = input[i].split(" ").map(Number);
let j;
const tempArr = [];
for (j = i + 1; j <= i + Y; j++) { // 현재 '인덱스 + 1'부터 '인덱스 + Y'까지 반복
const spl = input[j].split(" ");
tempArr.push(spl); // I ~ I+7줄까지의 내용을 tempArr에 넣기
}
tempArr.push([Y, X]); // 마지막으로 행렬에 대한 정보 Y,X를 tempArr에 넣어준다.
tcs.push(tempArr);// // 테스트케이스 배열에 넣어준다.
i = j - 1;
}
/*
[
[ [ '1', '2' ], [ '3', '4' ], [ '5', '6' ], [ 3, 2 ] ],
[ [ '-1', '-2', '0' ], [ '0', '0', '3' ], [ 2, 3 ] ]
]
*/
필기 안 하고 암산으로 풀려고 했는데 생각보다 복잡해서
결국 노트에 두 행렬의 col, row가 어떤 순서로 계산되어서 어떤 위치에 들어가야하는지를 그려보았다.
대강 노트에 끄적였던걸 그림판으로 그려보면 아래와 같다.
행렬 곱이 성립하려면 한 객체는 N x M이고 다른 한 객체는 M x L이어야 한다. 즉 한 변 M과 같이 동일한 수여야 한다.
이를 코드로 구현하려면 삼중포문을 썼어야했다. N의 변화와 L의 변화와 M의 변화를 모두 담아야하기 때문이다.
구현 코드는 아래와 같다.
내 풀이:
let fs = require("fs");
let input = fs.readFileSync("input.txt").toString().trim().split("\n");
// 1. 입력값에서 행렬을 파싱하기
let tcs = [];
for (let i = 0; i < input.length; i++) {
const [Y, X] = input[i].split(" ").map(Number);
let j;
const tempArr = [];
for (j = i + 1; j <= i + Y; j++) {
const spl = input[j].split(" ");
tempArr.push(spl);
}
tempArr.push([Y, X]);
tcs.push(tempArr); // 메타 데이터를 그냥 마지막에 한 번 넣어줬다.
i = j - 1;
}
// 2. 파싱한 행렬 A, B를 서로 곱해주기
const [A, B] = tcs; // A와 B행렬
const [AY, AX] = A.pop(); // 마지막에 넣은 메타데이터를 pop해서 구조분해할당
const [BY, BX] = B.pop(); // 마지막에 넣은 메타데이터를 pop해서 구조분해할당
for (let i = 0; i < AY; i++) { // A객체의 Y방향으로 순회
const AYrow = [];
for (let j = 0; j < BX; j++) { // B객체의 X방향으로 순회
let temp = 0;
for (let k = 0; k < BY; k++) { // B객체의 Y방향으로 순회
temp += +A[i][k] * +B[k][j];
}
AYrow.push(temp);
}
console.log(AYrow.join(" "));
}
'Algorithm > Coding Test' 카테고리의 다른 글
마인크래프트(백준 코딩테스트 18111번, 구현/브루트포스, NodeJS 풀이) (0) | 2024.05.06 |
---|---|
전화번호 목록(프로그래머스 레벨2, 해시, JavaScript 풀이) (0) | 2024.04.14 |
우승자는 누구?(백준 코딩테스트 5179번, 구현/정렬, NodeJS 풀이) (0) | 2024.03.27 |
태보태보 총난타(백준 코딩테스트 17249번, 문자열, NodeJS 풀이) (0) | 2024.03.24 |
귀여운 수~ε٩(๑> ₃ <)۶з(백준 코딩테스트 17294번, 문자열, NodeJS 풀이) (0) | 2024.03.24 |