조합이란 원소들을 조합하여 만들 수 있는 경우의 수이며 원소의 순서는 신경 쓰지 않습니다.
순열이란 원소의 값이 같더라도 순서가 다르면 서로 다른 원소로 취급하는 선택법입니다.
한글의 자모 24자 중 자음은 총 14개입니다.
이 중 입력받은 자음을 n개를 선택하여 나올 수 있는 모든 조합과, 조합의 수를 출력하고 싶습니다.
'한글 맞춤법'의 제 2장 제4항에서는 한글의 기본 자모 24자 "ㄱ(기역), ㄴ(니은), ㄷ(디귿), ㄹ(리을), ㅁ(미음), ㅂ(비읍), ㅅ(시옷), ㅇ(이응), ㅈ(지읒), ㅊ(치읓), ㅋ(키읔), ㅌ(티읕), ㅍ(피읖), ㅎ(히읗), ㅏ(아), ㅑ(야), ㅓ(어), ㅕ(여), ㅗ(오), ㅛ(요), ㅜ(우), ㅠ(유), ㅡ(으), ㅣ(이)"를 제시
나올 수 있는 모든 조합을 아래와 같이 출력해 주세요.
<--요구 조건-->
1. 첫 번째 입력으로 선택할 한글 자음이 주어집니다.
2. 두 번째 입력으로 조합의 수가 주어집니다.
3. 주어진 조합의 수에 따라 조합과 조합의 수를 출력해 주세요.
function getCombination(consonantArray, combinationNum) {
const result = [];
// 한개만 골라서 조합을 할 경우 그냥 모든 원소 return
if (combinationNum === 1) return consonantArray.map((el) => [el]);
consonantArray.forEach((el, idx) => {
// 현재 인덱스 뒤로 모든 원소
const rest = consonantArray.slice(idx + 1);
// 현재 원소인 el을 하나 고르고, 한 개 뺀 나머지를 rest에서 고름
const combinations = getCombination(rest, combinationNum - 1);
// rest에서 고른 조합을 현재 원소인 el과 붙여줌
const attach = combinations.map((combination) =>
[el, ...combination].join('')
);
result.push(...attach);
});
return result;
}
const consonantArray = ['ㄱ', 'ㄴ', 'ㄷ', 'ㄹ'];
const combinationNum = 3;
const result = getCombination(consonantArray, combinationNum);
console.log(result);
처음 딱 문제를 봤을때 조합문제라고 생각을하여 처음엔 반복문으로 모든 조합을 구하려고 했다.
그런데 그렇게 될 경우 예시에서는 3개라 얼마 안걸리지만, 배열의 길이가 길어지고 구하려는 조합의 길이가 길어질수록 오랜 시간이 걸려서 비효율적이라고 생각했다.
그래서 조합 공식을 검색해봐서 참고해서 했다.
처음에 재귀를 따라가기 어려웠으나 그리면서 해보니까 많이 도움되었다.
'PS > 제코베 JS 100제' 카테고리의 다른 글
제코베 JS 100제 / 82 / 수학 괄호 파싱 (0) | 2022.09.25 |
---|---|
제코베 JS 100제 / 81 / 지뢰찾기 (0) | 2022.09.25 |
제코베 JS 100제 / 79 / 순회하는 리스트 (1) | 2022.09.21 |
제코베 JS 100제 / 78 / 원형 테이블 (0) | 2022.09.21 |