1. 문제
문자열 s가 입력되었을 때 다음 규칙을 따라서 이 문자열을 여러 문자열로 분해하려고 합니다.
- 먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다.
- 이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 x가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다.
- s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복합니다. 남은 부분이 없다면 종료합니다.
- 만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다.
문자열 s가 매개변수로 주어질 때, 위 과정과 같이 문자열들로 분해하고, 분해한 문자열의 개수를 return 하는 함수 solution을 완성하세요.
제한사항
- 1 ≤ s의 길이 ≤ 10,000
- s는 영어 소문자로만 이루어져 있습니다.
입출력 예
"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와 같이 분해됩니다.
2. 풀이
function solution(s) {
var answer = [];
let x = 0;
let xCount = 0; //x와 같은 문자일 경우 카운트
let oCount = 0; //x와 다른 문자일 경우 카운트
for(let i =0; i<s.length; i++){
if(s[i] === s[x]){
xCount++;
}
else{
oCount++;
}
if(xCount === oCount){
answer.push(s.slice(x,i+1)) // x부터 i+1까지 잘라내서 answer에 push (원본 str변화 없음)
x = i+1 //x에 새로운 시작을 할당
xCount = 0; // 카운트 초기화
oCount = 0; // 카운트 초기화
}
else if(i === s.length-1){ // i가 마지막까지 xCount와 oCount가 같지 않게 순회한 경우
answer.push(s.slice(x)) //x부터 마지막글자까지 잘라내서 answer에 push
}
}
answer = answer.length;
return answer;
}
3. 알아야할 사항
1) slice 와 splice 헷갈렸던 경우.
2) .slice(start, end) :start부터 end까지 잘라낸다. 원본을 변경하지 않는다. (문자열, 배열 가능)
3) arr.splice(start, end) : start부터 end까지 잘라낸다. 원본을 변경한다. (배열)
'ComputerScience > 알고리즘, 프로그래머스' 카테고리의 다른 글
[Lv.1] 둘만의 암호 (정규식과 변수, 복잡한 재반복 for문) (0) | 2023.02.06 |
---|---|
[Lv.1] 성격유형 검사하기 (0) | 2023.02.06 |
[Lv.1] 크레인 인형뽑기 게임 (카카오 인턴 코딩테스트, 예외처리 실수) (0) | 2023.02.03 |
[Lv.1] 키패드 누르기(카카오 인턴 코딩테스트, 맨해튼 거리) (0) | 2023.02.03 |
[Lv.1] 체육복 (JS 한글변수의 힘) (1) | 2023.02.02 |
댓글