문제 설명
주어진 숫자들로 만들 수 있는 순열 중에서 특정 순서의 순열을 구하는 문제가 있습니다.
예를 들어, 숫자 1, 2, 3이 주어졌을 때 만들 수 있는 모든 순열은 다음과 같습니다:
- 123
- 132
- 213
- 231
- 312
- 321
문제는 특정 숫자의 순서를 몇 번째로 가지는지를 구하는 것입니다. 위의 예시에서 231은 4번째 순서에 해당합니다.
입력 형식
첫 번째 줄에 숫자의 개수 n
(1 ≤ n ≤ 10)이 주어집니다.
두 번째 줄에 n
개의 자연수가 주어집니다. (각 숫자는 1부터 n
까지의 서로 다른 자연수입니다.)
세 번째 줄에 원하는 순열의 인덱스 k
(1 ≤ k ≤ n!)이 주어집니다.
출력 형식
원하는 순열을 출력합니다.
문제 풀이
접근 방법
이 문제를 해결하기 위해 우리는 다음의 단계를 정의합니다:
- 모든 숫자 조합을 생성하여 순열 리스트를 만듭니다.
- 순열 목록에서 원하는 순서의 순열을 찾습니다.
순열 생성 알고리즘
여기서는 자바스크립트를 이용하여 순열을 생성하고 특정 순서를 찾는 과정을 설명하겠습니다. DFS (깊이 우선 탐색) 방법을 사용하여 순열을 생성할 것입니다.
자바스크립트 코드
function getPermutations(arr) {
const result = [];
const backtrack = (current, remaining) => {
if (remaining.length === 0) {
result.push(current);
return;
}
for (let i = 0; i < remaining.length; i++) {
const newCurrent = [...current, remaining[i]];
const newRemaining = [...remaining.slice(0, i), ...remaining.slice(i + 1)];
backtrack(newCurrent, newRemaining);
}
};
backtrack([], arr);
return result;
}
function findPermutation(n, nums, k) {
const permutations = getPermutations(nums);
return permutations[k - 1].join('');
}
// 예시 입력
const n = 3;
const nums = [1, 2, 3];
const k = 4;
// 출력
console.log(findPermutation(n, nums, k)); // 231
코드 설명
위의 코드는 두 개의 함수로 구성되어 있습니다:
- getPermutations: 주어진 배열의 모든 순열을 생성합니다.
- findPermutation: 원하는 인덱스에 해당하는 순열을 반환합니다.
getPermutations 함수 상세 설명
이 함수는 재귀적인 방식으로 순열을 생성합니다:
- 현재 배열의 요소 중 하나를 선택하고, 선택된 요소를 현재 조합에 추가합니다.
- 선택된 요소를 제외한 나머지 요소들로 새로운 배열을 만들어 재귀 호출을 진행합니다.
- 모든 요소가 선택될 때까지 이 과정을 반복하고, 완성된 순열을 결과에 추가합니다.
findPermutation 함수 상세 설명
이 함수는 다음과 같은 과정을 거칩니다:
- 주어진 숫자 배열에 대해 모든 순열을 생성합니다.
- 생성된 순열 배열에서
k-1
인덱스에 해당하는 순열을 찾아 문자열로 반환합니다.
시간 복잡도
이 알고리즘의 시간 복잡도는 O(n!)입니다. 모든 순열을 생성하기 때문에 숫자의 개수가 커질수록 연산 계산 시간이 매우 길어질 수 있습니다. 그러나 n값이 10 이하로 제한되었으므로 실용적인 수준에서 문제를 해결할 수 있습니다.
마무리
이제 순열을 만들고 특정 순서의 순열을 찾는 방법을 익혔습니다. 코딩테스트에서 자주 등장하는 문제 유형 중 하나이니, 연습을 통해 충분히 숙달하시기 바랍니다.
다음 시간에는 다른 알고리즘 문제를 가지고 다시 찾아뵙겠습니다. 감사합니다!