728x90
가위바위보 재귀 문제의 변형. 동일한 문자열을 가지지도 않음.
주어진 문자열의 순서를 바꿀 때 어느정도까지의 경우의 수가 나오는지를 체크하는 것.
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | /** * Given a single input string, write a function that produces all possible anagrams * of a string and outputs them as an array. At first, don't worry about * repeated strings. What time complexity is your solution? * * Extra credit: Deduplicate your return array without using uniq(). */ /** * example usage: * var anagrams = allAnagrams('abc'); * console.log(anagrams); // [ 'abc', 'acb', 'bac', 'bca', 'cab', 'cba' ] */ var allAnagrams = function (string) { // string = apps //debugger; let strArr = string.split(''); //= [a,p,p,s] let res = {}; let check = []; // = 0: a , 1:p , 2: p, 3: s / [f,f,f,f] //문자열내에서 해당 문자는 반복적으로 못쓰지만 apps 처럼 자체적으로 문자가 2번 이상 쓰인 경우에 대해서 고려해야함 //자릿수는 중복될수 없기때문에 각 문자들을 인덱스 즉 자리로 구분하기 for (let j = 0; j < strArr.length; j++) { check[j] = false; } makeAnagrams = (str, count) => { if (count === strArr.length) { //res.indexOf(str) === -1 이걸로 유니크한 값을 추려내려니 시간복잡도가 문제 //결국 객체로 값을 별도로 주는 방법을 활용해야 하는 건가? if (!res[str]) { res[str] = true; } } else { for (let i = 0; i < strArr.length; i++) { // i = 0 = a if (check[i] === false) { check[i] = true; // check = [t,f,f,f] makeAnagrams(str + strArr[i], count + 1); check[i] = false; str.slice(0, count); } } } }; makeAnagrams('', 0); return Object.keys(res); }; //allAnagrams(`debitcard`); | cs |
728x90
'CS STUDY > Algorithm&Data structure' 카테고리의 다른 글
Heap(힙) 자료구조에 대해서 (0) | 2020.12.09 |
---|---|
[JS]알고리즘 문제풀이 10 (0) | 2020.11.19 |
[JS]알고리즘 문제풀이 8_linked list활용 (0) | 2020.11.10 |
[JS]알고리즘 문제풀이 7_이벤트메소드 생성 (0) | 2020.11.10 |
[JS]알고리즘 문제풀이6_재귀활용 (0) | 2020.11.08 |