문자열 t에 문자열 s가 순서대로 들어있는지 여부 반환
각 문자가 꼭 이어져 있지 않아도 되지만 순서대로 등장해야 함
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isSubsequence = function(s, t) {
let sIdx = 0;
let tIdx = 0;
while (tIdx < t.length) {
if (s[sIdx] === t[tIdx])
sIdx++;
tIdx++;
}
return sIdx === s.length;
};
두 문자열을 순회할 인덱스 번호 sIdx, tIdx
t의 길이를 기준으로 돌면서 둘이 같을 경우 sIdx 증가
t를 다 순회한 후 sIdx가 s의 길이와 같으면 (모든 문자가 들어있었으면)
true 반환, 아니면 false 반환
Accepted
Runtime 53ms (Beats 62.54%)
Memory 48.30MB (Beats 95.49%)
처음에는 while 문의 조건을 sIdx < s.length && tIdx < t.length
로 했었는데, 다시 생각해보니 문자열은 인덱스가 길이를 벗어나더라도 참조 에러가 아닌 undefined로 읽어들이기 때문에 딱히 sIdx의 범위를 제한할 필요는 없었다. 하지만 t가 훨씬 길고 s의 순환이 일찍 끝나서 판단이 완료되었을 때는 비효율적일 거라고 생각한다. 그럼 여기서 s의 length를 매번 확인하는 작업과 비교했을 때 어떤 것이 더 효율적일까? 일단 결과 지표를 봤을 때 리트코드에서 제공한 테스트 케이스로는 전자가 더 효율적이었던 것 같다. 그리고 마지막 결과 반환 부분에서 if(sIdx === s.length) return true; return false;
로 작성했었는데, 굳이 if문을 사용하지 않고 비교 결과를 반환하는 것이 훨씬 깔끔한 것 같아서 수정하였다. 이런 부분을 놓치지 않도록 한번씩 더 생각해보자.