문제
N*M크기의 두 행렬 A와 B가 주어졌을 때, 두 행렬을 더하는 프로그램을 작성하시오.
입력
첫째 줄에 행렬의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 차례대로 주어진다. 이어서 N개의 줄에 행렬 B의 원소 M개가 차례대로 주어진다. N과 M은 100보다 작거나 같고, 행렬의 원소는 절댓값이 100보다 작거나 같은 정수이다.
출력
첫째 줄부터 N개의 줄에 행렬 A와 B를 더한 행렬을 출력한다. 행렬의 각 원소는 공백으로 구분한다.
예제
예제 입력1:
3 3
1 1 1
2 2 2
0 1 0
3 3 3
4 4 4
5 5 100
예제 출력1:
4 4 4
6 6 6
5 6 100
해결
시간: 172ms
A array와 B array를 만들어 두 값을 더해주는 식으로 작성했다.
for문을 두번 쓰고 싶지 않아 다른 방법을 찾아보려 다른 답들을 확인해봤는데, for문은 모두 두번 쓰고 있었다.
대신 다른 점은 내가 작성한 것보다 시간이 훨씬 빠르다는 점!
나는 한줄 한줄씩 입력받는 방법으로 구성했다.
rl.on("line", (line) => {
// array 구성..
});
다른 답을 살펴보니
텍스트 파일을 한번에 읽는 것이 더 빠르다.
왜냐면 splice 함수를 사용 해서 array를 더 효과적으로 나눌 수 있다.
약 70ms 정도 차이가 났다.
for문 대신 map을 쓰는 방법도 있다니 참고..
const result = arrayA.map((rowA, i) =>
rowA.map((valA, j) => valA + arrayB[i][j])
);
코드
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let n, m;
let arrayA = [];
let arrayB = [];
rl.on("line", (line) => {
input = line.split(" ").map((e) => parseInt(e));
if (!n && !m) {
[n, m] = input;
return;
}
if (arrayA.length === n) {
arrayB.push(input);
} else {
arrayA.push(input);
}
}).on("close", () => {
let result = [];
for (i = 0; i < n; i += 1) {
let calcResult = [];
for (j = 0; j < m; j += 1) {
const calc = arrayA[i][j] + arrayB[i][j];
calcResult.push(calc);
}
result.push(calcResult.join(" "));
}
console.log(result.join("\n"));
});
'Algorithm' 카테고리의 다른 글
[node.js] 백준 25206 - 너의 평점은 (0) | 2024.10.15 |
---|---|
[node.js] 백준 1316 - 그룹 단어 체커 (0) | 2024.10.14 |
[node.js] 백준 2941 - 크로아티아 알파벳 (1) | 2024.10.13 |
[node.js] 백준 1157 - 단어 공부 (0) | 2024.10.13 |
[node.js] 백준 10988 - 팰린드롬인지 확인하기 (0) | 2024.10.12 |