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

Hyun·2023년 6월 17일
0

프로그래머스

목록 보기
11/32

문제 설명

문자열 s가 입력되었을 때 다음 규칙을 따라서 이 문자열을 여러 문자열로 분해하려고 합니다.

먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다.
이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 x가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다.
s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복합니다. 남은 부분이 없다면 종료합니다.
만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다.
문자열 s가 매개변수로 주어질 때, 위 과정과 같이 문자열들로 분해하고, 분해한 문자열의 개수를 return 하는 함수 solution을 완성하세요.

제한사항
1 ≤ s의 길이 ≤ 10,000
s는 영어 소문자로만 이루어져 있습니다.

입출력 예
입력: "banana"
출력: 3

문제 풀이

처음 풀이

def solution(s):
    answer = 0
    arr = list(s)

    while(1):
        s_cnt = 1
        d_cnt = 0
        first = arr[0]
        # 배열 길이 1
        if(len(arr) == 1):
            answer = answer + 1  
            break

        # 배열 길이 2이상
        for idx in range(1, len(arr)):
            # 첫 문자와 다른 경우 
            if(arr[idx] != first):
                d_cnt = d_cnt + 1
            # 첫 문자와 동일한 경우
            else:
                s_cnt = s_cnt + 1
            # 카운트가 같은 경우
            if(d_cnt == s_cnt):
                answer = answer + 1     
                # idx가 배열의 끝 인덱스인 경우 => answer 리턴
                if(idx+1 == len(arr)):
                    return answer
                # 그렇지 않은 경우 => arr 인덱스 idx + 1 부터로 변경
                else:
                    arr = arr[idx+1: ]
                    break;
            # 카운트가 같지 않으면서 배열의 끝에 도달한 경우
            if(idx+1 == len(arr)):
                answer = answer + 1
                return answer

    return answer

나중 풀이

  • 배열을 잘라서 다시 for문을 돌 필요가 없다는걸 알게됨(pivot을 이용하여 다시 비교를 시작할 문자를 설정해주면 되기때문)
  • s_cnt 와 d_cnt를 다시 초기화시킬 필요가 없다는 걸 알게됨.
    같아지는 경우 이후로는 다시 0,0으로 초기화한것과 다를 바가 없기때문(값이 중요한게 아니라 처음에 같아야 하는게 필요하기 때문)

=> pivot을 이용하므로서 배열을 잘라 처음부터 다시 돌 필요가 없고, s_cnt, d_cnt가 초기화될 필요가 없기때문에 결과적으로 하나의 for문으로만 처리가 가능하다.

def solution(s):
    answer = 0
    s_cnt = 0
    d_cnt = 0
    pivot = ''
    
    # 이렇게 풀려면 첫 문자인 경우에도 s_cnt == d_cnt 적용해서 answer+=1 적용시켜줄 수 밖에 없음
    # => 맨 마지막에 남은 문자열에 대해 answer+=1 해줄 필요 없게 됨
    for ch in s: 
        # 직전 for문에서 이미 문자 카운트가 동일해진 경우임 
        if(s_cnt == d_cnt):
            answer+=1
            a = ch #다시 시작하기 위해 pivot을 설정
        
        if(ch == a):#현재 문자가 pivot인 경우(pivot과 동일한 경우 포함)
            s_cnt+=1
        else:
            d_cnt+=1
        
    return answer
profile
better than yesterday

0개의 댓글