-
[알고리즘/자바스크립트] 반복되지 않는 첫 알파벳 찾기 (First non-repeating character)Algorithm 2019. 8. 4. 22:09
-해당 문제는 codewars사이트의 level5 문제입니다. (1~8단계 중 8단계가 가장 쉬운 레벨)-
First non-repeating characterWrite a function named first_non_repeating_letter that takes a string input, and returns the first character that is not repeated anywhere in the string.
For example, if given the input 'stress', the function should return 't', since the letter t only occurs once in the string, and occurs first in the string.
As an added challenge, upper- and lowercase letters are considered the same character, but the function should return the correct case for the initial letter.
For example, the input 'sTreSS' should return 'T'.
If a string contains all repeating characters, it should return an empty string ("") or None -- see sample tests.
파라미터로 문자열을 받아서 반복되지 않는 첫 알파벳을 리턴하는 문제이다.
예를 들어서 'stress'라는 단어가 주어졌다면 이 문자열에서 오직 하나만 존재하는 알파벳인 't'와 'e'중에서 먼저 나오는 't'를 리턴해야한다. 또한 알파벳을 찾을때는 대/소문자를 구분하지 않고 연산하되 답을 리턴할때는 대/소문자를 구분하여 리턴해야한다. 만약에 모든 알파벳이 반복된다면 ""을 리턴한다.
function firstNonRepeatingLetter (s) { const duplicate = {}; const lowerS = s.toLowerCase(); for (let i = 0; i < s.length; i++) { if (duplicate[lowerS[i]]) continue; if (lowerS.indexOf(lowerS[i], i + 1) !== -1) { duplicate[lowerS[i]] = true; } else { return s[i]; } } return ''; }
내가 가장 먼저 푼 방법은 이렇다.
우선 모든 문자를 소문자로 만든 복사본 lowerS를 만들고
for문을 돌려서 i + 1부터 lowerS[i]가 존재하는지 indexOf() 메소드로 검사한다.
만약에 존재하지 않으면 원본 문자열에서 i번째 알파벳을 리턴하고
존재하면 duplicate 객체에 넣는다. (중복 방지를 위해서)
function firstNonRepeatingLetter (s) { const lowerS = s.toLowerCase(); for (let i = 0; i < s.length; i++) { if (lowerS.indexOf(lowerS[i]) === lowerS.lastIndexOf(lowerS[i])) { return s[i]; } } return ''; }
문제를 다 풀고 다른 사람 풀이를 보다가 훨씬 더 간단하고 신박한 방법을 찾았다.
그건 바로 indexOf()와 lastIndexOf() 메소드로 리턴받은 인덱스가 일치하는지 확인하는 방법이다!
만약에 중복되는 문자가 존재한다면 당연히 indexOf()의 인덱스와 lastIndexOf()의 인덱스가 다를 것이고
오로지 한 개만 존재하는 문자라면 인덱스가 같을 것이다.
function firstNonRepeatingLetter (s) { const lowerS = s.toLowerCase(); for (let i = 0; i < s.length; i++) { let target = lowerS.slice(0, i) + lowerS.slice(i + 1); if (target.indexOf(lowerS[i]) === -1) { return s[i]; } } return ''; }
이 방법은 현재 검색하고 있는 알파벳을 제외한 나머지 알파벳들로 string을 만들고
그 string에서 indexOf()로 내가 검색하는 알파벳이 존재하는지 확인하는 방법이다.
반응형'Algorithm' 카테고리의 다른 글
[알고리즘/자바스크립트] Pig Latin 게임 (Simple Pig Latin) (609) 2019.08.04 [알고리즘/자바스크립트] 아나그램 모두 찾기 (Where my anagrams at?) (484) 2019.08.04 [알고리즘/자바스크립트] 알파벳 스크램블 (Scramblies) (484) 2019.08.03 [알고리즘/자바스크립트] 한 자리수가 될 때까지 곱하기 (Persistent Bugger) (609) 2019.08.03 [알고리즘/자바스크립트] 트리에서 잎노드 개수 구하기 (Tree Count Leaves) (484) 2019.07.23 COMMENT