본문 바로가기
알고리즘 Node.js

백준 2588문제. 곱셈

by 반갑조? 2025. 2. 24.

문제

문제:

(세 자리 수) × (세 자리 수)는 다음과 같은 과정을 통하여 이루어진다.

(1)과 (2)위치에 들어갈 세 자리 자연수가 주어질 때 (3), (4), (5), (6)위치에 들어갈 값을 구하는 프로그램을 작성하시오.

입력: 첫째 줄에 (1)의 위치에 들어갈 세 자리 자연수가, 둘째 줄에 (2)의 위치에 들어갈 세자리 자연수가 주어진다.

출력: 첫째 줄부터 넷째 줄까지 차례대로 (3), (4), (5), (6)에 들어갈 값을 출력한다.

예제 입력: 472

                 385

예제 출력: 2360

                 3776 

                 1416

                 181720

 

 

고민 

(2)위치의 세 자리 자연수(385)를 하나씩 분리(3, 8, 5)해서 곱한다음 곱한 수를 변수에 저장하고 마지막에 출력하는게 어떨까?

 

풀이와 풀이 해석

풀이 공통

1. fs.readFileSync('/dev/stdin')

- 입력을 한 번에 가져온다.

2. .toString().split('\n')

- 줄바꿈(\n)을 기준으로 나눈다.

답1

// 답 1. 고민의 의도대로 풀이한 로직
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split('\n');
const a = Number(input[0]);
const b = input[1];
const c = b.split('').reverse();
const d = c.map((x)=> Number(x)*a);
console.log(d.join('\n'));
console.log(a*Number(b));

3. const a와 b

- a는 숫자로 변환한다. (숫자 472)

- b는 자리수를 접근을 쉽게 하기위해 문자열 그대로 둔다.(문자열 "385")

4. split()과 reverse()

- split('')을 사용하여 각 자리 숫자로 쪼갠다.(['3','8','5'])

- 그리고 reverse()를 사용하여 일의 자리부터 시작하도록 뒤집는다.(['5','8','3'])

- 변수명 c에는 문자열 배열이 저장되어있다.

5. map()

- map()을 사용하여 각 자리수에 숫자 a를 곱한다. (d = [472 * 5, 472 * 8, 472 * 3])

- 이때 c에 저장된 각각의 자리수는 아직 문자열이므로 Number()를 사용하여 숫자타입으로 변환 후 계산하게 한다.

- 변수명 d에는 [2360, 3776, 1416] 각 자리수를 곱한 값이 숫자 배열로 저장되어있다.

6. console.log()

- join( '\n' )을 사용하여 배열의 값을 줄바꿈('\n') 하여 출력한다.

 

답2

// 답 2. 숫자 b의 일의 자리, 십의 자리, 백의 자리를 분리
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split('\n');
const a = parseInt(input[0]);
const b = parseInt(input[1]);

const b_ones = b % 10; // 일의 자리
const b_tens = Math.floor((b % 100) / 10); // 십의 자리
const b_hundreds = Math.floor(b / 100); // 백의 자리

console.log(a * b_ones);
console.log(a * b_tens);
console.log(a * b_hundreds);
console.log(a * b);

3. 변수명 a와 b

- a와 b모두 숫자로 변환한다.

4. 자리수 분리

- 숫자의 일의 자리, 십의 자리, 백의 자리를 분리하여 각각의 변수에 저장한다.

5. console.log()

- 숫자a 와 각 자리수를 분리한 변수를 각각 곱하여 출력한다.

 

답3

// 답 3. 문자열의 인덱스를 사용
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split('\n');
const a = parseInt(input[0]);
const b = input[1]; // 두 번째 숫자 문자열로 처리 ['3','8','5']

console.log(a * parseInt(b[2])); // a X 일의 자리
console.log(a * parseInt(b[1])); // a X 십의 자리
console.log(a * parseInt(b[0])); // a X 백의 자리
console.log(a * parseInt(b)); // a X 전체 숫자

3. 변수명 a와 b

- a는 숫자로 변환한다.

- b는 문자열로 유지하여 각 자리수를 쉽게 접근하게 둔다.

4. console.log()

- b[2]는 일의 자리, b[1]은 십의 자리, b[0]는 백의 자리이다. 각 자리수를 숫자로 변환하여 a의 숫자타입과 맞춘 후 계산을 진행한다.

 

더 알아보기

- 우선 나는 처음 혼자 풀 때 문제를 틀렸다. 일의 자리, 십의 자리, 백의 자리를 고정된 숫자로 곱해서 그렇다.

- 그래서 고민한게 일의 자리, 십의 자리, 백의 자리를 분리해서 처음 입력받은 숫자와 차례대로 곱하면 될거라고 생각했다.

- 그렇게 정답인 로직이 '답 1' 이다.

- 답3도 고민했던 로직과 같아 보이지만 더 간결해보여서 좋은 코드라고 생각한다.

 

- for문 풀이도 매력적으로 보였다.

const fs = require('fs');
const [a,b] = fs.readFileSync('/dev/stdin').toString().split('\n')

for(seat of b.split('').reverse()){
   console.log(Number(a) * Number(seat))
}
console.log(Number(a)*Number(b));

for문 해석

1. b.split(''): "385"를 ['3', '8', '5']로 변환 (각 자리 숫자로 쪼갬)

2. .reverse(): [5, 8, 3] (일의 자리부터 시작하도록 뒤집음)

3. for (ar of b.split('').reverse()): 각 자리 숫자(seat)를 하나씩 순회하며 a와 곱셈

4. console.log(Number(a) * Number(seat)): a*seat값을 출력