티스토리 뷰

https://www.acmicpc.net/problem/1722

 

1722번: 순열의 순서

첫째 줄에 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄의 첫 번째 수는 소문제 번호이다. 1인 경우 k(1 ≤ k ≤ N!)를 입력받고, 2인 경우 임의의 순열을 나타내는 N개의 수를 입력받는다. N개의 수에는 1부터 N

www.acmicpc.net

인풋 받아서 쪼개고  전부 숫자로 바꾸는 습관 때문에 계속 틀렸다   split(' ').map(Number)  

 

꼼꼼하게 BigInt 처리 해야 한다. 

 

let input = require('fs').readFileSync('./dev/stdin').toString().split('\n');
const N = +input[0];
const [k, ...nums] = input[1].split(' ');
let src = [];
for (let i = 0; i <= N; i++) src.push(i);
const factorial = [BigInt(1)];
for (let i = 1; i <= N - 1; i++) factorial.push(BigInt(factorial[i - 1]) * BigInt(src[i]));
src.shift();

if (+k == 1) {
        let target = BigInt(nums[0]) - BigInt(1);
        const answer = [];
        let cnt = N - 1;
        while (cnt >= 0) {
                const share = target / factorial[cnt];
                target -= share * factorial[cnt];
                answer.push(src[Number(share)]);
                src = src.filter((_, i) => i != Number(share));
                cnt--;
        }
        console.log(answer.join(' '));
} else {
        let answer = BigInt(1);
        let f = N;
        nums.forEach((t) => {
                const index = src.findIndex((v) => v == t);
                src = src.filter((v) => v != t);
                answer += factorial[--f] * BigInt(index);
        });
        console.log(answer.toString());
}
728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함