Toy #1 orderOfPresentation
문제
총 조의 수 N과 선생님이 말씀하시는 발표 순서 k가 주어질 때, 김코딩이 정답을 말 할 수 있게 올바른 리턴 값을 구하세요.
모든 경우의 수가 담긴 배열은 번호가 작을수록 앞에 위치한다고 가정합니다.
ex) N = 3일경우, [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
let output = orderOfPresentation(3, [2, 3, 1]);
console.log(output); // 3
output = orderOfPresentation(5, [1, 3, 2, 4, 5])
console.log(output); // 6
풀이
function orderOfPresentation (N, K) {
// N = 3 일 경우, 경우의 수 총 6가지 => 3 x 2 x 1 = 6 (순열)
const factorial = (n) => {
if (n <= 1) return 1;
return n * factorial(n - 1);
};
// 리턴할 값 변수 생성
let result = 0;
// 이미 포함된 조를 파악하기 위해 false로 채워진 배열 생성
// (+1 : 인덱스는 0부터 시작하지만 조는 1부터 시작하기 때문)
const isUsed = Array(N + 1).fill(false);
for (let i = 0; i < K.length; i++) {
// K 배열의 i번째 수를 사용했는지 판별하기 위해, 그 값을 num 변수에 할당하고,
// 그 num을 index 삼아 isUsed 배열 값을 true로 변경
// (이 문제의 경우 중복 값이 없기 때문에 가능함)
const num = K[i];
isUsed[num] = true;
// num 보다 앞에 올 수 있는 수들의 배열을 복제한 후,
// 그 배열 안에 있는 false의 개수를 구함
const candidates = isUsed.slice(1, num);
const falseCount = candidates.filter((x) => x === false).length;
// 아직 사용되지 않은 수, 그 전까지의 모든 경우의 수를 카운트
const realCount = falseCount * factorial(N - i - 1);
result += realCount;
}
return result;
}
/*
N = 5, K =[1, 3, 2, 4, 5] 일때의 과정 풀이
1. i = 0, num = K[0] = 1, isUsed[1] = true
isUsed = [false, true, false, false, false, false]
candidates = isUsed.slice(1, 1) = []
falseCount = 0
realCount = 0
result = 0
2. i = 1, num = K[1] = 3, isUsed[3] = true
isUsed = [false, true, false, true, false, false]
candidates = isUsed.slice(1, 3) = [true, false]
falseCount = 1
realCount = 1 * factorial(5 - 1 - 1) = 1 * factorial(3) = 6
result = 6
3. i = 2, num = K[2] = 2, isUsed[2] = true
isUsed = [false, true, true, true, false, false]
candidates = isUsed.slice(1, 2) = [true]
falseCount = 0
realCount = 0
result = 6
4. i = 3, num = K[3] = 4, isUsed[4] = true
isUsed = [false, true, true, true, true, false]
candidates = isUsed.slice(1, 4) = [true, true, true]
falseCount = 0
realCount = 0
result = 6
5. i = 4, num = K[4] = 5, isUsed[5] = true
isUsed = [false, true, true, true, true, true]
candidates = isUsed.slice(1, 5) = [true, true, true, true]
falseCount = 0
realCount = 0
result = 6
*/
Author And Source
이 문제에 관하여(Toy #1 orderOfPresentation), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@tiatiahwang/Toy-1-orderOfPresentation저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)