algorithm 연습5
문제. 인자로 받는 문자열이 각기 다 다른 알파벳으로 이루어져있다면 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를 연습한 보람이 느껴지는 코드였다.