문제 설명

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

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

문자열 s가 매개변수로 주어질 때, 위 과정과 같이 문자열들로 분해하고, 분해한 문자열의 개수를 return 하는 함수 solution을 완성하세요.

제한사항

  • 1 ≤ s의 길이 ≤ 10,000
  • s는 영어 소문자로만 이루어져 있습니다.
  • 문제 보러가기


문제 풀이

(1) 코드 작성

def solution(s):
    l = []
    x, y = 0, 0
    first_alpha = False
    new_string = ''
    # 문자열을 규칙에 따라 분해하는 과정
    for alpha in s:
        if not first_alpha:
            first_alpha = alpha
            new_string += alpha
            x += 1
        elif alpha == first_alpha:
            new_string += alpha
            x += 1
        else:
            new_string += alpha
            y += 1
        # 개수가 같아지는 시점(기존변수 초기화)
        if x == y:
            l.append(new_string)
            x, y = 0, 0
            first_alpha = False
            new_string = ''
    # 마지막에 남는 문자열도 포함시키는 과정
    if len(new_string) > 0:
        l.append(new_string)
    return len(l)

(2) 코드 리뷰

코드를 작성하기 전에 슈도코드를 작성해 보았는데 그 슈도코드는 아래와 같다.

  1. 첫 번째 알파벳을 boolean 형태로 저장한다(첫 번째 알파벳을 새로 지정해 주는 조건문을 추가하기 위함).
  2. 첫 번째 알파벳과 같은 알파벳이 오는 수(x), 다른 알파벳이 오는 수(y)를 담을 변수를 생성한다.
  3. s의 알파벳들을 하나씩 불러오기 위해 반복문을 사용한다.
    • 첫 번째 알파벳이 존재하지 않으면 그때의(반복문에서의) 알파벳을 첫 번째 알파벳 값으로 지정하고 x 값을 1 증가시킨다.
    • 알파벳 값이 첫 번째 알파벳 값과의 동일 여부에 따라 x, y 값을 증가시킨다.
  4. x와 y가 같아질 때의 문자열 조합을 리스트에 담는다(기존 변수 초기화).
  5. 리스트에 담긴 요소의 길이를 출력한다.

슈도코드를 간단하게 작성하고 나서 예시 테스트 코드를 실행해 보며 어떻게 문제에 접근할 것인지 과정을 추가하였다. 처음엔 마지막에 남는 문자열을 포함시키는 과정을 넣지 않아서 테스트 2에서 실패가 떴다. 그래서 마지막 if 문을 추가하여 넣는 과정을 추가했다. 코드를 다 작성하고 리뷰를 하다 보니 문자열을 조합하고 리스트에 조합된 문자열을 넣는 과정이 불필요하다는 것을 알게 되었다. 그래서 그 부분을 제거한 코드를 다시 작성해 보았다. 수정된 코드는 아래와 같다.

(3) 수정된 코드

def solution(s):
    x, y, answer = 0, 0, 0
    first_alpha = False

    for alpha in s:
        if not first_alpha:
            first_alpha = alpha
            x += 1
        elif alpha == first_alpha:
            x += 1
        else:
            y += 1
        # x와 y가 같아지는 시점(기존변수 초기화)
        if x == y:
            x, y = 0, 0
            first_alpha = False
            answer += 1
    # x, y 값이 리셋되지 않은 경우(분해된 문자열 개수에 포함안된 경우)
    if x != 0 or y != 0:
        answer += 1
    return answer

👩🏻‍💻개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다.

댓글남기기