https://school.programmers.co.kr/learn/courses/30/lessons/147355
문제 설명
숫자로 이루어진 문자열 t와 p가 주어질 때, t에서 p와 길이가 같은 부분문자열 중에서, 이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요.
예를 들어, t="3141592"이고 p="271" 인 경우, t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다. 이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다.
제한사항
1 ≤ p의 길이 ≤ 18
p의 길이 ≤ t의 길이 ≤ 10,000
t와 p는 숫자로만 이루어진 문자열이며, 0으로 시작하지 않습니다.
function solution(t, p) {
var answer = 0;
let minString
let maxString
if (t.length >= p.length){
minString = p
maxString = t
}else{
minString = t
maxString = p
}
minString, maxString //
const minLength = minString.length;
for (let i=0 ; i < maxString.length - minLength+1 ; i++){
const subString = maxString.slice(i, i+minLength)
subString
if (Number(subString) <= Number(minString )){
answer ++;
}
}
return answer;
}
정답은 맞췄지만, 문제를 꼼꼼히 읽지 않아서 불필요한 코드가 추가되었습니다.
function solution(t, p) {
let answer = 0;
const pLength = p.length;
for (let i = 0; i <= t.length - pLength; i++) {
const subStr = t.slice(i, i + pLength);
if (subStr <= p) {
answer++;
}
}
return answer;
}
오늘은 슬라이딩 윈도우를 활용한 부분 문자열 문제 풀이를 연습했습니다. t
문자열에서 p
와 길이가 같은 모든 부분 문자열을 순차적으로 비교하며 조건에 맞는 값을 찾아야 했기 때문에, 조건문과 반복문을 활용한 최적화가 중요했습니다. slice
를 사용하여 부분 문자열을 추출하고, JavaScript에서 숫자로 비교하는 것과 문자열 비교의 차이를 확인할 수 있었습니다.
어떤 문제가 있었고, 나는 어떤 시도를 했는지
주어진 문제에서 t
와 p
문자열 길이를 조건으로 여러 부분 문자열을 검사해야 하는데, 불필요한 조건을 줄여 코드를 간결하게 만들고자 했습니다. 처음에는 길이 비교를 통해 변수를 나누었지만, 불필요한 부분이라는 것을 깨닫고 단순화할 수 있었습니다.
어떻게 해결했는지
문제의 제약을 명확히 이해한 뒤, t
와 p
의 길이에 따라 불필요한 조건문을 제거하고, 직접적인 비교만으로 해결했습니다. 문자열을 숫자 변환 없이 비교할 수 있다는 점을 새롭게 알았습니다.
무엇을 새롭게 알았는지
JavaScript에서 <=
연산자를 통해 문자열 숫자 비교를 바로 할 수 있다는 점이 흥미로웠습니다. 이로 인해 불필요한 숫자 변환 과정을 생략하여 성능을 개선할 수 있었습니다.
내일 학습할 것은 무엇인지
내일은 슬라이딩 윈도우 기법을 더 복잡한 문제에 적용해보며 시간 복잡도를 최적화하는 방법에 집중할 계획입니다. 다양한 문자열 비교 방식과 배열 탐색 기법도 함께 학습할 예정입니다.