JS 프로그래머스 문자열 나누기

이명진·2023년 2월 24일
0

코드카타

목록 보기
61/69

프로그래머스 레벨 1문제 . 문제를 이해하는데 시간이 오래걸렸다.

문제 요약

문자열이 주어진다. 문자열을 왼쪽에서 오른쪽으로 하나씩 읽어 나간다.
그러니까 타겟이 문자열 하나 하나 이다. 타겟을 잡았을때 타겟에서부터 쭉 읽을때 타겟과 같은 것을 세고 아닌 문자열을 세서
둘이 같을 경우 그 자리에서 읽기를 중단하고 문자열을 나눈다. 이런식으로 반복하는데
자른 문자열은 제외하고 그다음 문자열에서 반복하면 된다.

내가 푼 풀이


function solution(s) {
    var answer = [];
    let sArr = s.split('')
    
    while(sArr.length){
      let [arr,cnt] = sliceS(sArr)
      sArr=cnt;
      answer.push(arr)
    }
    
    return answer.length;
}

function sliceS(charArr){
    const target = charArr.shift();
  let sameArr = [target];
    let notSameArr = [];

  while(charArr.length!==0){
    if(sameArr.length==notSameArr.length){
      let sumArr = sameArr.concat(notSameArr);
      return [sumArr,charArr]
    }
    let char = charArr.shift();
    
    if(char===target){
      sameArr.push(char);
    }else{
      notSameArr.push(char);
    }
    }
  return [sameArr.concat(notSameArr),charArr]
}

따로 함수를 만들어서 문제를 풀었다. 같은 문자열 배열과 다른 문자열 배열을 만들어서 하나씩 뽑아서 넣어주고 배열의 길이가 같을 경우 정답 배열에 넣어주고 정답배열의 길이를 리턴해주는 방법으로 풀었다.

결과는 다. 통과시킬수 있었다. 코드가 길긴 길지만 한번에 문제를 풀었다.

다른사람들의 풀이

다들 비슷하게 푼것 같지만 대부분 배열을 안두고 그냥 카운트만 사용했고 재귀로 많이 푼것 같았다.

그중에서도 바로 재귀로 문제를 풀고 구조분해할당을 한 코드를 가져왔다.


function solution(s, count=0) {
    if(!s) return count
    let [first, ...rest] = s.split("")
    let countSame = 1
    let countInSame = 0
    let i=0
    for(; i<rest.length; i++){
        if(rest[i] === first) countSame++
        else countInSame++
        if(countSame === countInSame) break
    }
    return solution(rest.slice(i+1).join(""), count+1)
}

다른 함수를 두지않고 바로 주어진 함수를 변형해서 재귀로 활용했다. 이해하기는 더 좋은것 같다.
이해하기 쉬운 코드를 짜야할텐데 더 공부를 해야 할것 같다.

profile
프론트엔드 개발자 초보에서 고수까지!

0개의 댓글