https://www.acmicpc.net/problem/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개이다.
입력
첫째 줄에 테스트 케이스의 수가 주어진다.
각 테스트 케이스의 첫째 줄에 A의 크기 N이 주어지고, 둘째 줄에 수열 A의 원소가 주어진다. 수열 A의 원소는 공백으로 구분되어 있다.
다음 셋째 줄에는 B의 크기 M, 넷째 줄에는 수열 B의 원소, 다섯째 줄에는 C의 크기 K, 여섯째 줄에는 C의 원소가 주어지며, 수열 A의 정보와 같은 형식으로 되어 있다.
수열의 크기는 50을 넘지 않는 양의 정수이고, 수열의 원소는 30,000보다 작거나 같은 양의 정수이다.
출력
각각의 테스트 케이스마다 입력으로 주어진 수열을 이용해 만들 수 있는 서로 다른 행운의 수의 개수를 한 줄에 하나씩 출력한다.
예제 입력 1 복사
2
6
100 1 10 100 1 1
7
3 53 53 53 53 53 53
6
4 54 4 54 4 54
1
47
1
500
1
33
예제 출력 1 복사
2
0
문제풀이(1)
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const input = require("fs").readFileSync(filePath).toString().trim().split("\n");
const T = parseInt(input.shift());
for (let i = 0; i < T; i++) {
const testCaseArr = input.splice(0, 6);
const A = testCaseArr[1].split(" ").map(Number);
const B = testCaseArr[3].split(" ").map(Number);
const C = testCaseArr[5].split(" ").map(Number);
const luckySet = new Set();
for (const a of A) {
for (const b of B) {
for (const c of C) {
const sum = a + b + c;
if (isLuckyNumber(sum)) {
luckySet.add(sum);
}
}
}
}
console.log(luckySet.size);
}
function isLuckyNumber(num) {
const forbiddenDigits = ["0", "1", "2", "3", "4", "6", "7", "9"];
const digits = num.toString().split("");
return !digits.some((digit) => forbiddenDigits.includes(digit));
}
'Algorithm' 카테고리의 다른 글
[Baekjoon]20363번 당근 키우기 - Javascript (0) | 2024.02.19 |
---|---|
[Baekjoon]12927번 배수 스위치 - Javascript (0) | 2024.02.16 |
[Baekjoon]1544번 사이클 단어 - Javascript (0) | 2024.02.14 |
[Baekjoon]10211번 Maximum Subarray (1) | 2024.02.08 |
[Baekjoon]25214번 크림 파스타 - Javascript (1) | 2024.02.07 |