오늘 문제는 정말 어려웠다.
중복을 찾는 로직을 생각해내는게 많이 어려웠는데
처음에는 split('')으로 다 나눈다음에 반복문으로 인덱스를 돌면서 중복검사를 하려고했다.
하지만 경우가 너무 많아지고 복잡해져서 포기
그 다음에 indexOf를 사용해서 -1을 반환하지 않는경우를 생각하면서 중복검사를 해보려고 헀으나 이 방법도 잘되지 않았다!
옆자리 현지님은 Map을 이용하고 바이너리 알고리즘? 이런걸로 푸셨다는데 나한테 설명을 친절하게 해주어도 너무 낯선 개념이라 바로 응용하는게 어려웠다...
결국 못 알아듣고 포기
구글링 도중 좋은풀이가 있어서 참고를 했다.
우선 문제!
str: 텍스트
return: 중복되지 않은 알파벳 길이 (숫자 반환)
예를 들어,
str = "abcabcabc"
return은 3
=> 'abc' 가 제일 길기 때문
str = "aaaaa"
return은 1
=> 'a' 가 제일 길기 때문
str = "sttrg"
return은 3
=> 'trg' 가 제일 길기 때문
풀이 코드는 다음과 같다.
const getLengthOfStr = str => {
let sliceArr = [];
let sliceLength = 0;
for (let i = 0; i < str.length; i++) {
if(sliceArr.indexOf(str[i]) === -1) {
sliceArr.push(str[i]);
if(sliceLength < sliceArr.length) {
sliceLength = sliceArr.length;
}
}
else {
sliceArr = sliceArr.slice(sliceArr.indexOf(str[i]) + 1);
sliceArr.push(str[i]);
}
}
return sliceLength;
}
getLengthOfStr('sttrg');
우선 배열과 길이를 선언하고 초기화 한다.
그리고 반복문을 돌면서 배열에 str문자가 있는지를 확인하고
없으면 push해서 배열에 넣어주고 없으면 있으면 기존에 있던 중복된 값 다음부터 짤라서 push 해준다.
그리고 sliceLength를 반환하는데 만약 sliceLength 보다 sliceArr의 길이보다 클 경우 sliceArr의 길이로 값을 갱신해준다.
느낀점
많이 어려웠다.
사고를 전개하는 방식이 아직 많이 미숙한것 같다.
slice 함수에 대해서 어렴풋이 알고있었는데 이참에 더 공부해야겠다.