자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
(1) 완전 탐색 효율성 여부
(2) 구현 전략
const solution = (n: number, m: number) => {
let result = "";
const output: number[] = [];
const rec_fuc = (k: number) => {
// 같아지는 순간이 재귀 종료 시점
if (k === m) {
result += `${output.join(" ")}\n`;
return;
}
// k번째 자리에 n숫자를 번갈아가면서 넣어주기
for (let i = 0; i < n; i++) {
output[k] = i + 1;
// 재귀를 돌며 k + 1 자리에 n번 또 반복 한다.
rec_fuc(k + 1);
// 재귀 끝부터 빠져나오면서 해당 k자리를 초기화 해준다.
output[k] = 0;
}
};
rec_fuc(0);
return result;
};
solution(3,3);
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
(1) 완전 탐색 효율성 여부
(2) 구현 전략
const solution = (n: number, m: number) => {
let result = "";
const output: number[] = [];
const used: number[] = [];
const rec_fuc = (k: number) => {
// 같아지는 순간이 재귀 종료 시점
if (k === m) {
result += `${output.join(" ")}\n`;
return;
}
// k번째 자리에 n숫자를 번갈아가면서 넣어주기
for (let i = 0; i < n; i++) {
if (!used[i]) {
// k번째 자리에 i + 1값을 기입
output[k] = i + 1;
// i번째 자리 숫자를 사용했으므로 기입
used[i] = 1;
// 재귀를 돌며 k + 1 자리에 n번 또 반복 한다.
rec_fuc(k + 1);
// 재귀 끝부터 빠져나오면서 해당 k자리를 초기화 해준다.
output[k] = 0;
// 재귀 끝부터 빠져나오면서 해당 i번자리 초기화
used[i] = 0;
}
}
};
rec_fuc(0);
return result;
};
solution(3,3);
(1) 완전 탐색 효율성 여부
(2) 구현 전략
const solution = (n: number, m: number) => {
let result = "";
const output: number[] = [];
const rec_fuc = (k: number) => {
// 같아지는 순간이 재귀 종료 시점
if (k === m) {
result += `${output.join(" ")}\n`;
return;
}
let start = output[k - 1];
// 초기설정
if (!start) start = 1;
// k번째 자리에 i숫자를 넣어주는데 시작점은 중복 허용하므로 전 값이다.
// for문 횟수가 전보다 한번 줄어드므로 i <= n 진행
for (let i = start; i <= n; i++) {
// k번째 자리에 i값을 기입
output[k] = i;
// 재귀를 돌며 k + 1 자리에 n번 또 반복 한다.
rec_fuc(k + 1);
// 재귀 끝부터 빠져나오면서 해당 k자리를 초기화 해준다.
output[k] = 0;
}
};
rec_fuc(0);
return result;
};
solution(3,3);
(1) 완전 탐색 효율성 여부
(2) 구현 전략
const solution = (n: number, m: number) => {
let result = "";
const output: number[] = [];
const used: number[] = [];
const rec_fuc = (k: number) => {
// 같아지는 순간이 재귀 종료 시점
if (k === m) {
result += `${output.join(" ")}\n`;
return;
}
// 초기설정
let start = (output[k - 1] ? output[k - 1] : 0) + 1;
// k번째 자리에 i숫자를 넣어주는데 시작점은 중복 허용 안하므로 전 값에 + 1이다.
// for문 횟수가 전보다 한번 줄어드므로 i <= n 진행
for (let i = start; i <= n; i++) {
// k번째 자리에 i값을 기입
output[k] = i;
// 재귀를 돌며 k + 1 자리에 n번 또 반복 한다.
rec_fuc(k + 1);
// 재귀 끝부터 빠져나오면서 해당 k자리를 초기화 해준다.
output[k] = 0;
}
};
rec_fuc(0);
return result;
};
solution(3,3);