-
[알고리즘/자바스크립트] 알파벳 스크램블 (Scramblies)Algorithm 2019. 8. 3. 22:09
-해당 문제는 codewars사이트의 level5 문제입니다. (1~8단계 중 8단계가 가장 쉬운 레벨)-
Scramblies
Complete the function scramble(str1, str2) that returns true if a portion of str1 characters can be rearranged to
match str2, otherwise returns false.
- Only lower case letters will be used (a-z).
- No punctuation or digits will be included.
- Performance needs to be considered.
scramble('rkqodlw', 'world'); // ==> True scramble('cedewaraaossoqqyt', 'codewars'); // ==> True scramble('katas', 'steak'); // ==> False
지난번에 풀었던 아나그램 문제보다 좀 더 쉽게 느껴진 스크램블 문제.
저번에 풀었던 문제에서는 두 문자열의 알파벳 수가 완벽히 일치해야했고,
공백이나 특수문자를 제외시키는 작업도 필요했는데, 이번에는 그런 작업 필요없이
str2의 알파벳이 모두 str1에 존재하면 true, 존재하지 않는 것이 하나라도 있으면 false를 리턴하는 문제이다.
function scramble(str1, str2) { const charList = str1.split('').reduce((acc, cur) => { acc[cur] = (!acc[cur]) ? 1 : acc[cur] + 1; return acc; }, {}); return str2.split('').every((char) => { if (!charList[char]) { return false; } charList[char] -= 1; return true; }); }
내가 처음에 푼 방법은 위와 같다.
먼저 str1을 알파벳 단위로 쪼개서 배열로 만든 다음에
각 알파벳의 개수를 세서 객체를 만든다.
str2 역시 알파벳 단위로 쪼개서 배열로 만든 후 every() 메소드를 사용하여
아까 만든 객체, charList에 알파벳이 있으면 값을 1 감소시키고,
개수가 0이거나 없으면 false를 리턴한다.
문제를 다 풀고 다른 사람들의 풀이를 좀 보다가
every() 메소드 안의 조건을 한 줄로 간단하게 쓸 수 있다는 것을 깨달았다.
function scramble(str1, str2) { const charList = str1.split('').reduce((acc, cur) => { acc[cur] = (!acc[cur]) ? 1 : acc[cur] + 1; return acc; }, {}); return str2.split('').every((char) => --charList[char] >= 0); }
charList[char]의 값을 바로 감소시킨 후 0보다 크거나 같은지를 리턴한다! 이렇게 간단한 방법이!
반응형'Algorithm' 카테고리의 다른 글
[알고리즘/자바스크립트] 아나그램 모두 찾기 (Where my anagrams at?) (484) 2019.08.04 [알고리즘/자바스크립트] 반복되지 않는 첫 알파벳 찾기 (First non-repeating character) (609) 2019.08.04 [알고리즘/자바스크립트] 한 자리수가 될 때까지 곱하기 (Persistent Bugger) (609) 2019.08.03 [알고리즘/자바스크립트] 트리에서 잎노드 개수 구하기 (Tree Count Leaves) (484) 2019.07.23 [알고리즘/자바스크립트] 뒤집어진 연결 리스트 (Reverse Linked List) (609) 2019.07.18 COMMENT