문제
2577번: 숫자의 개수
첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 크거나 같고, 1,000보다 작은 자연수이다.
www.acmicpc.net
세 개의 자연수 A, B, C가 주어질 때 A × B × C를 계산한 결과에 0부터 9까지 각각의 숫자가 몇 번씩 쓰였는지를 구하는 프로그램을 작성하시오.
예를 들어 A = 150, B = 266, C = 427 이라면 A × B × C = 150 × 266 × 427 = 17037300 이 되고, 계산한 결과 17037300 에는 0이 3번, 1이 1번, 3이 2번, 7이 2번 쓰였다.
풀이 1
const readFileSyncAddress = '/dev/stdin';
const fs = require('fs');
let input = fs.readFileSync(readFileSyncAddress).toString().trim().split(/\n/g).map(Number)
const nums =input.reduce((a,c) => a*c).toString().split('').map(Number);
// 0~9 => 0 해쉬맵 생성
let hash = new Map();
const arr = [0,1,2,3,4,5,6,7,8,9];
for(let x of arr){
hash.set(x,0);
}
// nums의 요소 x의 갯수를 카운트
for(let x of nums){
if(hash.has(x)) hash.set(x,hash.get(x)+1);
}
// 값을 한줄씩 출력
for(let [key,val] of hash){
console.log(val);
}
- 0~9 까지의 키가 담긴 새로운 맵을 생성하여 세 수를 받아 곱한 값의 배열 요소와 비교하여 값을 카운팅하고, 이 값을 한 줄씩 출력하는 방식으로 풀었다.
- 같은 길이를 도는 for문이 세 번이나 쓰였는데, 이를 한 번으로 줄일 수 있을 것 같아 배열 메소드를 활용한 다른 풀이 방법을 참고하여 다시 풀었다.
풀이 2
const readFileSyncAddress = '/dev/stdin';
const fs = require('fs');
let input = fs.readFileSync(readFileSyncAddress).toString().trim().split(/\n/g).map(Number)
const nums =input.reduce((a,c) => a*c).toString().split('').map(Number);
for(let i = 0; i < 10; i++){
let arr = nums.filter((e)=> e === i);
console.log(arr.length);
}
- key, value 쌍의 맵을 만들지 않고, filter 메소드를 활용해 그 길이를 반환하는 풀이방법.
- Array.filter 메소드는 배열 내 항목 중 매개변수로 전달된 조건을 충족시키는 배열들만 반환한다. (원래 배열을 변경하지 않음.)
- 이 경우 i를 반복할 때마다 nums배열의 요소 e와 i가 같은 경우만 골라 새로운 배열을 계속 생성한다.
- 그와 동시에 그 배열의 길이를 출력하여 중복된 숫자의 갯수를 세는 것이다.
참고자료
'Algorithm & 자료구조 > 알고리즘 w.JavaScript' 카테고리의 다른 글
[알고리즘] 백준 1546번: 평균 W_node.js (0) | 2022.04.27 |
---|---|
[알고리즘] 백준 3032번: 나머지 W_node.js (0) | 2022.04.27 |
[알고리즘] 백준 2439번: 별찍기-2 W_node.js (0) | 2022.04.25 |
[알고리즘] 백준 1110번: 더하기 사이클 W_node.js (0) | 2022.04.25 |
[알고리즘] 백준 10950번: A+B - 3 W_node.js (0) | 2022.04.25 |