analogcoding

algorithm 연습5 본문

Study JS for me/Algorithm

algorithm 연습5

be well 2019. 4. 27. 16:13

문제. 인자로 받는 문자열이 각기 다 다른 알파벳으로 이루어져있다면 true , 중복된 알파벳이 있으면 false를 리턴.

 

Ex) input : "Dermatoglyphics"   =>  output : true

       input : "aba" / "moOse"    =>  output : false

 

해결방안.

 

1. input 값의 대소문자 상관없이 구분.

2. 각 글자들을 비교해서 중복된 글자가 있는지 확인.

3. Boolean 값 리턴.

 

첫 번째 솔루션.

 

underscore 에 uniq함수를 활용해서 해결한 솔루션.

 

input값을 대소문자 구분없이 만들고 배열로 나눠준다. 하나 씩 값을 넣어서 비교를 위한 빈 배열을 생성한다.

var isIsogram = function(str) {
  str = str.toLowerCase();
  str = str.split('')
  var check = [];
  var result = false;

 for문과 if문을 이용해서 각 글자를 새 배열에 넣어주고 그 배열에 includes() 메소드를 사용해서 안에 값이 없을 때만 추가해준다.

그렇게 추가한 새 배열의 길이가 기존 input을 나눈 배열과 같다면 중복된 글자가 없는 것이고 더 적다면 중복된 글자는 제외하고
추가된 것이기에 중복이 있는 것을 판단한다.

for(let i = 0 ; i < str.length; i++){
    if(!check.includes(str[i])){
      check.push(str[i]);
      if(check.length === str.length){
        result = true;
      }
    }
  }
  return result;
}

 

결과확인

 

 

두 번째 솔루션.

 

대소문자 구분 , 각 배열로 나누어준 뒤 every()함수를 써서 각 요소를 indexOf() 와 lastIndexOf의 린턴 값으로 비교해서 중복이 있다면 
 'avcda' 에 a가 indexOf 에선 0 , lastIndexOf에선 4 로 리턴되고  'avcda' 에 v는 indexOf 에선 1 , lastIndexOf에서도 1 로 리턴된다.

그렇기 때문에 모든 요소의 indexOf 와 lastIndexOf의 값이 모두 같다면 true 를 리턴하고 아니면 false를 리턴한다.

var isIsogram = function(str) { 
  var arr = str.toLowerCase().split('');
    return arr.every(function(char){
       return arr.indexOf(char) === arr.lastIndexOf(char);
     });
}

 

결과확인

 

 

두 번째 솔루션은 다른 분께서 제시해주신 방법이다. 굉장히 효율적이고 every와  indexOf , lastIndexOf 를 잘 사용한 예제라서

굉장히 좋은 코드인 것 같다. 첫 번째 솔루션의 경우 underscore를 연습한 보람이 느껴지는 코드였다.

'Study JS for me > Algorithm' 카테고리의 다른 글

algorithm 연습7  (0) 2019.04.28
algorithm 연습6  (0) 2019.04.28
algorithm 연습4  (0) 2019.04.27
algorithm 연습3  (0) 2019.04.26
algorithm 연습2  (0) 2019.04.26
Comments