코딩테스트 28일차
크기가 작은 부분문자열
숫자로 이루어진 문자열 t와 p가 주어질 때, t에서 p와 길이가 같은 부분문자열 중에서, 이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요.
예를 들어, t="3141592"이고 p="271" 인 경우, t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다. 이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다.
function solution(t, p) {
var answer = 0;
var len = p.length;
for (var i = 0; i <= t.length - len; i++) {
var substr = t.substring(i, i + len);
if (parseInt(substr) <= parseInt(p)) {
answer++;
}
}
return answer;
}
✏️풀이
먼저, solution 함수는 문자열 t와 문자열 p를 매개변수로 받습니다. 이 함수는 t에서 길이가 p와 같은 부분문자열 중에서 p가 나타내는 수보다 작거나 같은 수가 나오는 횟수를 반환하는 역할을 합니다.
코드의 첫 번째 줄에서는 answer라는 변수를 0으로 초기화합니다. 이 변수는 p가 나타내는 수보다 작거나 같은 수가 나오는 횟수를 저장할 변수입니다.
다음으로, len이라는 변수에 p의 길이를 저장합니다. 이렇게 함으로써 추후에 p와 길이가 같은 부분문자열을 추출할 때 사용됩니다.
그 다음은 반복문입니다. for 문을 사용하여 i 변수를 0부터 t의 길이에서 p의 길이를 뺀 값까지 1씩 증가시킵니다. 이렇게 함으로써 모든 가능한 부분문자열을 순회할 수 있습니다.
안쪽에 있는 substring() 함수는 t 문자열에서 길이가 p와 같은 부분문자열을 추출하는 역할을 합니다. substring(i, i + len)은 t에서 인덱스 i부터 길이 len만큼의 부분문자열을 추출합니다.
다음으로, parseInt() 함수를 사용하여 추출한 부분문자열과 p를 정수로 변환합니다. parseInt() 함수는 문자열을 정수로 변환하는 내장 함수입니다.
그 후, 변환한 정수를 비교하여 부분문자열이 p보다 작거나 같은지 확인합니다. 작거나 같으면 answer 변수를 1 증가시킵니다. 이렇게 함으로써 p가 나타내는 수보다 작거나 같은 부분문자열을 찾아 개수를 세게 됩니다.
마지막으로, answer 변수를 반환하여 결과를 출력합니다.
문자열 나누기
문자열 s가 입력되었을 때 다음 규칙을 따라서 이 문자열을 여러 문자열로 분해하려고 합니다. 먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다. 이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 x가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다. s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복합니다. 남은 부분이 없다면 종료합니다. 만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다. 문자열 s가 매개변수로 주어질 때, 위 과정과 같이 문자열들로 분해하고, 분해한 문자열의 개수를 return 하는 함수 solution을 완성하세요.
function solution(s) {
var answer = 0;
while (s.length > 0) {
var x = s[0]; // 첫 글자를 x로 설정
var countX = 1; // x의 개수를 카운트
var countOther = 0; // x가 아닌 다른 글자의 개수를 카운트
for (var i = 1; i < s.length; i++) {
if (s[i] === x) {
countX++;
} else {
countOther++;
}
if (countX === countOther) {
answer++;
s = s.slice(i + 1); // 현재까지 읽은 부분을 분리하고 남은 부분으로 설정
break;
}
}
if (countX !== countOther) {
answer++;
break;
}
}
return answer;
}
✏️풀이
answer 변수를 0으로 초기화합니다.
while 루프를 통해 문자열 s가 빈 문자열이 될 때까지 반복합니다.
첫 글자를 x로 설정하고, countX와 countOther를 각각 1과 0으로 초기화합니다.
for 루프를 통해 문자열 s의 두 번째 글자부터 마지막 글자까지 순회합니다.
현재 글자가 x와 같으면 countX를 증가시키고, 그렇지 않으면 countOther를 증가시킵니다.
countX와 countOther의 값이 같아지는 순간, 현재까지 읽은 부분을 분리하고 남은 부분으로 설정합니다. (s.slice(i + 1)을 통해 분리) countX와 countOther의 값이 다른 상태에서 for 루프가 문자열의 끝까지 도달하면, 현재까지 읽은 부분을 분리하고 종료합니다.
분해한 문자열의 개수인 answer를 증가시킵니다.
answer를 반환하여 결과를 출력합니다.