CS와 언어, 라이브러리 이론/알고리즘-이론과 실전
8. [실전] - 문자열 나누기
이게뭐당가
2023. 1. 18. 09:33
문제
먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다.
이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서,
"x"와 "x가 아닌 다른 글자들이 나온 횟수"를 각각 셉니다.
"처음으로 두 횟수가 같아지는 순간 멈추고", "지금까지 읽은 문자열을 분리합니다."
s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복합니다. 남은 부분이 없다면 종료합니다.
만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다.
문자열 s가 매개변수로 주어질 때, 위 과정과 같이 문자열들로 분해하고,
분해한 문자열의 개수를 return 하는 함수 solution을 완성하세요.
s는 영어 소문자로만 이루어져 있습니다.
예시
s result
"banana" 3
"abracadabra" 6
"aaabbaccccabba" 3
입출력 예 #1
s="banana"인 경우 ba - na - na와 같이 분해됩니다.
입출력 예 #2
s="abracadabra"인 경우 ab - ra - ca - da - br - a와 같이 분해됩니다.
입출력 예 #3
s="aaabbaccccabba"인 경우 aaabbacc - ccab - ba와 같이 분해됩니다.
x = a
"a 가 나온횟수" === "a 이외의 것이 나온 횟수" => 종료
여태 센것 제거
x = c
"c 가 나온횟수" === "c 이외의 것이 나온 횟수" => 종료
...
프로세스
1. score 가 들어온다 날짜별로 [2] , [2, 10], [2, 10, 3], [2,10,3, 50] ...
2. 날짜별로, 점수를 k 만큼 오름차순 정렬한다. [2], [10,2], [10,3,2] , [50,10,3] ... k=3 일경우
3. 오름차순 정렬한 것 중에, 최소값만 뽑는다 2 ,2 , 2 , 3
4. 최소값을 Array에 날짜별로 담는다. [2,2,2,3]
** slice 는 새 배열을 반환하므로 가능한 일이다. splice 는 원본배열을 조작해서 안된다.
** slice 를 처음부터 원하는 위치까지 받기 위해서는 0 부터 "1까지" 해야 "하나", 0부터 2까지 하면 "두개"가 된다.
0~0 라고 0인덱스를 반환하지 않고 0~1 을 해야 0 인덱스를 반환하는 것이다.
내코드
function solution(s) {
let arr = [];
let x = 0;
let y = 0;
while (s.length > 0) {
let count = 0; // 실직적 카운트
for (let i = 0; i < s.length; i++) { // i 부터, 문자열의 길이까지 돌린다.
s[0] === s[i] ? (x += 1) : (y += 1); // 첫째와 i번째가 같다면, x 를 세고, 아니면 y를 센다.
if (x === y) { // 둘이 같아지면 for 문을 종료하고, count(몇 번째 i 까지 갔나 확인)를 넣는다.
count = i + 1;
break;
}
}
arr.push(s.slice(0, count)); // 몇번째 i 까지 갔는지 확인하는 count 까지 자르고, 배열에 넣는다.
s = s.slice(count); // 그리고 배열을, count 부터 시작하는 글자로 만든다.
if (count === 0) break; // 아직, "s.length 가 > 0" (while문) 이므로 다시 반복한다.
} // 최종적으로," count 가 0"(위의 if문이 한번도 실행되지않음)이되면" while 문을 종료"
console.log(arr);
return arr.length;
}