이번 문제는 스택으로 풀려고 했다가 아직 스택을 사용하여 풀기에는 제 실력이 미치지 못했다고 판단이 되어 for문으로 해결을 했습니다.
우선 문자열을 split으로 arr 변수에 따로 담아준 후 x에 arr의 첫번째 요소를 담고 문자열의 길이만큼 for문을 돌아주면서 현재 arr의 index의 값이 x와 같을 경우 xScore를 증가, 다를 경우 otherScore에 증가를 시켜줍니다.
그 후 if 조건문으로 xScore와 otherScore의 값이 같을 때 result를 증가 시킨 후 start 변수에는 0을, end 변수에는 xScore와 otherScore를 합친 값(나눌 문자열의 길이)을 할당한 후 arr.splice(start, end)로 그 문자열을 잘라주는 효과를 취합니다.
그리고 x에 자르고 난 후의 arr의 첫번째 요소를 다시 할당한 후 index와 xScore, otherScore를 0으로 초기화 해줍니다. 그렇게 되면 for문의 i의 값을 쓸 필요 없이 arr의 배열을 자른 후 처음부터 다시 실행을 하는 효과를 얻을 수 있는 것이죠.
물론 if에 걸려지지 않았다는건 두 글자(x와 다른 글자들의 개수)의 수가 동일하지 않음을 의미하므로 index를 증가시켜 주면서 계속 검사를 실시합니다.
그렇게 for문이 끝나고 나면 배열의 나뉜 단어를 세는 result가 반환 될텐데, 문제는 x와 다른 문자의 개수가 달라 그래도 남은 문자가 존재하는 상황이 있을 수 있습니다. 이게 뭔 말이냐면 각 문자마다 x와 다른 문자의 개수가 같은 상황에서 잘리고 남은 단어가 없다면, 배열의 길이는 0일테지만, 그렇지 않는다면 배열에는 무조건 하나 이상의 단어가 남아있을 겁니다. (arr은 배열이므로)
그래서 반환을 할건데, 만약 arr의 길이가 0 초과일 경우 result에 1을 더한 값을 반환해주고, 아닌 경우라면, 즉 배열에 아무것도 남지 않은 상황이라면 result를 반환해 주면 해결됩니다. (이래뵈도 세 시간 고민해서 겨우 풀은 문제입니다... ㅜㅜ)
function solution(s) { let result = 0; let arr = s.split(''); let xScore = 0; let otherScore = 0; let x = arr[0] let index = 0; for(let i = 0 ; i < s.length ; i++){ if(arr[index] === x) xScore++; else otherScore++; if(xScore === otherScore) { result ++ let start = 0 let end = otherScore + xScore; arr.splice(start, end) x = arr[0]; [index, xScore, otherScore] = [0,0,0]; }else index++ } return result = arr.length > 0 ? result+1 : result }