BOJ/Node.js
[BOJ / Node.js] 18511. 큰 수 구성하기
도리닥닥
2023. 2. 23. 21:33
728x90
https://www.acmicpc.net/problem/18511
18511번: 큰 수 구성하기
첫째 줄에 N, K의 원소의 개수가 공백을 기준으로 구분되어 자연수로 주어진다. (10 ≤ N ≤ 100,000,000, 1 ≤ K의 원소의 개수 ≤ 3) 둘째 줄에 K의 원소들이 공백을 기준으로 구분되어 주어진다. 각
www.acmicpc.net
문제
N보다 작거나 같은 자연수 중에서, 집합 K의 원소로만 구성된 가장 큰 수를 출력하는 프로그램을 작성하시오. K의 모든 원소는 1부터 9까지의 자연수로만 구성된다.
예를 들어 N=657이고, K={1, 5, 7}일 때 답은 577이다.
입력
첫째 줄에 N, K의 원소의 개수가 공백을 기준으로 구분되어 자연수로 주어진다. (10 ≤ N ≤ 100,000,000, 1 ≤ K의 원소의 개수 ≤ 3) 둘째 줄에 K의 원소들이 공백을 기준으로 구분되어 주어진다. 각 원소는 1부터 9까지의 자연수다.
단, 항상 K의 원소로만 구성된 N보다 작거나 같은 자연수를 만들 수 있는 경우만 입력으로 주어진다.
출력
첫째 줄에 N보다 작거나 같은 자연수 중에서, K의 원소로만 구성된 가장 큰 수를 출력한다.
예제 입력 1
657 3
1 5 7
예제 출력 1
577
Solve
- 주어진 배열을 돌며, 가능한 숫자 조합을 모두 만들고, n보다 작거나 같은 경우만 numbers에 담아 주었습니다.
- base case는 n의 길이와 조합한 숫자의 길이로 설정했으며, 조건에 맞는 숫자들 중 최대값을 출력 해주었습니다.
Problem
- base case를 n의 길이와 조합한 숫자의 길이로 설정할 경우, n이 `11111111` 이고, arr에 `1` 만 있는 경우와 같이, 배열에 담기는 숫자가 없는 case가 있었습니다. 그런 경우에는 주어진 k의 원소 중 가장 큰 값을 n-1 길이만큼 반복해주어, 예외처리를 하였습니다.
- 가장 큰 수를 구하는 것이기 때문에 굳이 numbers에 모든 경우를 저장하지 않고, max값 만 도출하는 방법이 조금 더 효율적일 것이라고 생각합니다.
Code
const input = require("fs").readFileSync("/dev/stdin").toString().trim().split("\n");
const [n, k] = input[0].split(' ');
const arr = input[1].split(' ').map(el=>+el);
arr.sort((a,b)=>b-a);
const numbers = [];
const findNumber = (temp) => {
if(temp.length === n.length) {
const a = +temp.join('');
if(a <= +n) {
numbers.push(a)
}
return;
}
for(let i = 0 ; i < arr.length; i++) {
findNumber([arr[i], ...temp]);
}
}
findNumber([]);
console.log(numbers.length === 0 ? (arr[0]+"").repeat(n.length-1) : Math.max(...numbers));