문제: String 형인 str 인자에서 중복되지 않은 알파벳으로 이루어진 제일 긴 단어의 길이를 반환해주세요.
예를 들어, str = "abcabcabc" return 은 3 => 'abc' 가 제일 길기 때문 str = "aaaaa" return 은 1 => 'a' 가 제일 길기 때문 str = "sttrg" return 은 3 => 'trg' 가 제일 길기 때문
나의 풀이
const getLengthOfStr = str => {
let strArr = [];
let startNum;
for(i=0; i<str.length; i++) {
for(j=0; j<str.length; j++) {
startNum = str.slice(i,j+1);
if( startNum !== '') {
if( isDuplicate(startNum.split('')) == false ) {
strArr.push(startNum);
}
}
}
}
let longest = [];
for(i=0;i<strArr.length; i++) {
if(strArr[i].length > longest.length) {
longest = strArr[i];
}
}
function isDuplicate(arr) {
const isDup = arr.some(function(x) {
return arr.indexOf(x) !== arr.lastIndexOf(x);
});
return isDup;
}
return longest.length;
}
코드의 엄청난 길이가 너무 부끄럽지만 차근차근 해석해보자면,
let strArr = []; let startNum; for(i=0; i<str.length; i++) { for(j=0; j<str.length; j++) { startNum = str.slice(i,j+1); if( startNum !== '') { if( isDuplicate(startNum.split('')) == false ) { strArr.push(startNum); } } } }
startNum
변수에 인자로 들어온 알파벳으로 구성할 수 있는 모든 단어의 조합을 저장한다.(여기서 단어란 의미없는 알파벳의 나열이 되겠다.)
그때 첫번째 조건문에서 공백만으로 이루어졌을 경우를 제외하며
isDuplicate(startNum.split('')) == false
의 조건인 경우
선언해둔 배열 strArr
에 저장한다.
위 isDuplicate()
함수란
const isDup = arr.some(function(x) { return arr.indexOf(x) !== arr.lastIndexOf(x); }); return isDup; }
arr.some()
함수는 배열 arr
의 요소를 순서대로 callback
함수에 전달하고, callback
함수를 실행한다.
callback
함수에서는 요소 x
의 첫번째 index값과 x
의 마지막 index
값을 비교해서 같으면(중복x) false
를 반환, 다르면(중복o) true
를 반환한다. some()
함수는 또한 callback
함수가 한번이라도 true
를 리턴하면, true
를 리턴한다.
이제 중복없는 모든 단어들의 배열이 strArr
저장되었고,
let longest; for(i=0;i<strArr.length; i++) { if(strArr[i].length > longest.length) { longest = strArr[i]; } }
위 코드를 통해 배열 strArr
의 요소들중 가장 긴 단어를 변수 longest
에 저장한다. 그리고 최종적으로 longest.length
를 반환함으로써 풀이가 끝이난다.
위 알고리즘 문제를 풀며 느낀점 중 하나는 내가 문제를 풀면서 아무생각 없이? 해답에 다가간다는 느낌이 문득 들었다. 좀 더 간결한 코드를 짤 생각은 없이
for
,if
구문을 남발하며 줄일 수 있는 부분도 분명 존재함에도.... 줄이려는 노력조차 하지 않았다. 구글링을 통해서 나는 다른 사람의 문제풀이가 아닌 나만의 풀이를 만들고자 했었지만 나는 아직 배우는 과정이기 때문에 그 틀에서 벗어나 다양한 메서드들의 활용정도는 찾아 적용해가며 문제를 해결했다면 좀 더 좋지 않았을까... 생각해본다.