Baekjoon

[Baekjoon] js 9575 행운의 수

도옹건 2024. 2. 25. 21:01

문제

한슬이는 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에 값을 저장한다.

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]);
        }
      }
    }
  }

 

 

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);
}

 

 

 

문제 링크 : https://www.acmicpc.net/problem/9575