본문 바로가기
  • 삽질하는 자의 블로그
CS와 언어, 라이브러리 이론/알고리즘-이론과 실전

8. [실전] - 문자열 나누기

by 이게뭐당가 2023. 1. 18.

문제

  먼저 첫 글자를 읽습니다. 이 글자를 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;
}

 

댓글