1. 문제 풀이
1) 문제 : 크기가 작은 부분 문자열, 프로그래머스
숫자로 이루어진 문자열 t와 p가 주어질 때, t에서 p와 길이가 같은 부분문자열 중에서, 이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return 하는 함수 solution을 완성하세요.
예를 들어, t="3141592"이고 p="271" 인 경우, t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다. 이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개입니다.
2) 해석
- t에서 p와 길이가 같은 부분문자열 찾기
- t부분 문자열이 p의 숫자보다 작거나 같은 숫자의 횟수 return
3) 풀이
function solution(t, p) {
let cnt = 0;
for(let i=0; i<t.length; i++){
let str = t.slice(i, i+p.length);
if(str.length !== p.length) return cnt
if(str <= p) cnt++
}
return cnt;
}
t문자열에서 p의 길이와 같은 부분문자열을 모두 찾아야 했기에 for문을 사용했다.
그 후 slice를 이용해 부분문자열 부분만 뽑아내고, p의 값과 비교해 조건에 맞으면 cnt의 값을 올려줬다.
- 걸린 시간
2. 리팩토링
function solution(t, p) {
let cnt = 0;
const len = p.length
for(let i = 0; i <= t.length - len; i++){
const str = t.slice(i, i + len);
if(str <= p) cnt++;
}
return cnt;
}
1) let 변수
const str = t.slice(i, i + len);
str을 정의할 때, 나도 모르게 let을 사용했음을 알았다.
str의 경우 상수이기 때문에, const로 변경해 줬다.
*const 사용이유
- 의도를 명확히 표현
- 실수로 인한 버그 방지 > const는 재할당이 불가능함
- 코드 최적화 > 자바스크립트 엔진은 const로 선언 된 변수를 "변경되지 않는 값"으로 처리함 > 최적화 여지가 생김
2) 문자열 길이 검사
if(str.length !== p.length) return cnt
기존에는 t의 길이만큼 for문을 돌았기 때문에, str의 길이와 p의 길이가 안 맞는 부분을 조건문으로 처리해줘야 했다.
for(let i = 0; i <= t.length - len; i++)
i가 t.length - p.length 보다 크다면, p의 길이만큼 문자열을 만들 수 없다.
따라서 이를 for문에서 처리하면, 따로 조건문을 작성할 필요 없어진다.
3. 기타
1) slice
arr.slice(begin, end)
배열의 begin부터 end까지(미포함)에 대한 얕은 복사본을 새로운 배열 객체로 반환.
원본 배열은 바뀌지 않음.
const arr = [1, 2, 3, 4, 5];
arr.slice(1, 2) //[2]
const arr = [1, 2, 3, 4, 5];
arr.slice(2) //[3, 4, 5]
end 생략 시, 괄호 안의 숫자부터 끝까지 반환
const arr = [1, 2, 3, 4, 5];
arr.slice(2, -1) //[3, 4]
음수 인덱스는 배열의 끝에서부터 길이를 나타냄
'Algorithm > 99클럽' 카테고리의 다른 글
[99클럽] 코딩테스트 스터디, 7일차 TIL - 비기너 (0) | 2024.11.04 |
---|---|
[99클럽] 코딩테스트 스터디, 6일차 TIL - 비기너 (1) | 2024.11.04 |
[99클럽] 코딩테스트 스터디, 5일차 "모스부호" TIL - 비기너 (feat. 백준에서 자바스크립트 사용하기) (0) | 2024.11.03 |
[99클럽] 코딩테스트 스터디, 4일차 TIL - 비기너 (1) | 2024.10.31 |
[99클럽] 코딩테스트 스터디, 3일차 TIL - 비기너 (0) | 2024.10.30 |