문제 문자열 나누기
문자열 s의 첫 글자를 x라 하고, x와 x가 아닌 글자의 빈도를 세어서 같아지면 그 자리에서 문자를 분리합니다. 이 과정을 반복했을 때 몇 개의 문자로 나눠지는지 구하는 함수를 완성하세요.
let answer = 0;
answer는 문자를 나눈 횟수를 의미합니다.
let xCount = 0;
let zCount = 0;
x인 글자의 빈도수와 x가 아닌 글자(z라 칭함)의 빈도수를 셀 수 있는 변수를 만듭니다.
let stack = [];
빈도수가 같아질 때 이전의 문자 분리를 쉽게하기 위하여 stack 배열을 만들어 줍니다.
let str = [];
분리 된 문자를 담을 배열도 만들어 줍니다.
for(let i = 0; i < s.length; i++){
stack.push(s[i])
let x = stack[0]
if(s[i] === x){
xCount++;
} else {
zCount++;
if(zCount === xCount){
answer++;
str.push(stack.join(''))
xCount = 0;
zCount = 0;
stack = []
}
}
}
문자열의 길이만큼 반복하는 반복문 실행합니다.
실행될 때 마다 s의 i번째 문자가 stack 배열에 들어갑니다.
이때 첫 글자인 x는 stack의 0번째 요소입니다.
반복문 중 s[i]가 x와 같다면 x카운트 증가
같지 않다면 z카운트 증가
이 때 z카운트와 x카운트가 같아지면
문자의 나눈 횟수를 의미하는 answer를 증가시켜줍니다.
또 지금까지 stack 배열에 들어갔던 문자들을 join으로 묶어서 str 배열에 넣어줍니다.
새롭게 다시 이 과정을 반복해야하므로
x카운트와 z카운트, stack배열은 초기화 시켜줍니다.
마지막 글자가 혼자 남는다면 마지막 글자가 x가 되는데
빈도수가 같아질 z가 더이상 없으므로 나뉘어진 횟수(answer)에 들어가지 않게 됩니다.
지금까지 분리되었던 문자인 str 배열을 join으로 합쳐서 원본 문자열인 s와 길이를 대조했을 때 같지 않다면 마지막 글자가 혼자 남은 경우인 것입니다.
if(s.length === str.join('').length) {
return answer;
} else {
return answer+1;
}
이렇게 분기 처리를 해주어 answer를 반환하도록 하였습니다.
function solution(s) {
let answer = 0;
let xCount = 0;
let zCount = 0;
let stack = [];
let str = [];
for(let i = 0; i < s.length; i++){
stack.push(s[i])
let x = stack[0]
if(s[i] === x){
xCount++;
} else {
zCount++;
if(zCount === xCount){
answer++;
str.push(stack.join(''))
xCount = 0;
zCount = 0;
stack = []
}
}
}
if(s.length === str.join('').length) {
return answer;
} else {
return answer+1;
}
}