이상한 곱셈

문제

언어

  • JavaScript

순서도

  1. A 의 각 자리수 합 구하기
  2. B 의 각 자리수 합 구하기
  3. A 와 B 의 각 자리수 합의 곱 구하기

문제 풀이 step 1

  • A * B 를 계산하는 데, 새로운 방법으로 계산합니다.
    • 새로운 방법은 A 의 각자리 수와 B 의 각 자리수를 곱할 수 있는 모든 경우를 다 곱하는 것입니다.
  • 반복문을 사용하면서 O(A의 자리수 * B의 자리수) 만에 구하는 방식도 있지만, 이보다 더 빠른 방법이 있습니다.
  • A = A1A2, B = B1B2 라고 할때,
    • A * B = A1 * B1 + A1 * B2 + A2 * B1 + A2 * B2 입니다.
    • 위의 식을 정제하면, A * B = A1 * (B1 + B2) + A2 * (B1 + B2) 이고,
    • 이를 더 정제하면, A * B = (A1 + A2) * (B1 + B2) 입니다.
  • 결과적으로, A * B = (A1 + A2 + ...) * (B1 + B2 + ...) 과 같은 식을 도출할 수 있고, 이 식을 이용해서 계산하면 정답입니다.
  • 추가 설명은 주석으로 작성하겠습니다.

후기

  • 반복문 방식으로 계산해보고, 소요시간이 많이 나와서 다시 고민을 한 후에 위의 식에 도달할 수 있었습니다.
  • 중학교 시절 수학 문제가 생각나는 문제였습니다.

소스 코드

const input = require("fs")
	.readFileSync("/dev/stdin")
	.toString()
	.trim()
	.split("\n");

const solution = (input) => {
	const [a, b] = input[0].split(" ").map((v) => v.split("").map(Number));

	// A 의 각 자리수의 합과 B 의 각자리수의 합 곱하기
	return a.reduce((ac, v) => ac + v) * b.reduce((ac, v) => ac + v);
};

console.log(solution(input));