[Baekjoon] js 9575 행운의 수
문제
한슬이는 5와 8이 행운의 수라고 생각한다. 그래서 한슬이는 각 자리가 5와 8로만 이뤄져 있는 수를 행운의 수라고 한다.
정수 수열 A, B, C가 주어졌을 때 세 수열에서 각각 하나의 정수를 골라서 만들 수 있는 서로 다른 행운의 수의 개수를 구해보자.
예를 들어 A = [1, 10, 100], B = [3, 53], C = [4, 54]라고 한다면, 행운의 수를 만드는 방법은 8 = 1 + 3 + 4, 58 = 1 + 3 + 54, 58 = 1 + 53 + 4와 같이 총 3가지가 있다. 58은 2가지 방법으로 만들 수 있으니, 서로 다른 행운의 수의 개수는 8과 58, 총 2개이다.
해결과정
Set객체를 이용하여 문제를 해결하였다.
A,B,C 각각의 수열을 중복 없이 저장하기 위해 Set을 이용하여 수를 저장한 후 스프레드 연산자를 통해 배열로 저장했다.
const A = [...new Set(input.shift().split(" ").map(Number))];
const B = [...new Set(input.shift().split(" ").map(Number))];
const C = [...new Set(input.shift().split(" ").map(Number))];
결과값 또한 중복을 제거해야한 Set을 이용한다.
const result = new Set();
그 후 세 배열의 요소를 하나씩 골라 더해준다. 더한 값을 isLuckyNumber 함수로 판별하여 true이면 result에 값을 저장한다.
isLuckyNumber 함수를 이용하여 숫자를 10으로 나눈 나머지를 구하여 각 자릿수를 확인하고 자릿수가 5 또는 8로 이루어져있는지 판별한다.
const isLuckyNumber = (num) => {
while (num > 0) {
const digit = num % 10;
if (digit !== 5 && digit !== 8) {
return false;
}
num = Math.floor(num / 10);
}
return true;
};
만약 숫자가 58이라면
1. 58 % 10 = 8
2. 58 / 10 = 5
3. 5 % 10 = 5
4. 5 / 10 = 0
0이 되므로 true를 반환
숫자가 78이라면
1. 78 % 10 = 8
2. 78 / 10 = 7
3. 7 % 10 = 7
나머지가 7이기때문에 false를 반환
전체 코드
const fs = require("fs");
const input = fs
.readFileSync("./input/9t")
.toString()
.trim()
.split("\n")
.map((v) => v.trim());
const isLuckyNumber = (num) => {
while (num > 0) {
const digit = num % 10;
if (digit !== 5 && digit !== 8) {
return false;
}
num = Math.floor(num / 10);
}
return true;
};
const T = input.shift();
for (let i = 0; i < T; i++) {
const result = new Set();
input.shift();
let A = [...new Set(input.shift().split(" ").map(Number))];
input.shift();
let B = [...new Set(input.shift().split(" ").map(Number))];
input.shift();
let C = [...new Set(input.shift().split(" ").map(Number))];
for (let i = 0; i < A.length; i++) {
for (let j = 0; j < B.length; j++) {
for (let k = 0; k < C.length; k++) {
let sum = A[i] + B[j] + C[k];
if (isLuckyNumber(sum)) {
result.add(A[i] + B[j] + C[k]);
}
}
}
}
console.log(result.size);
}