코딩 테스트 연습/[프로그래머스] Python

[LV.4] 연습문제 > 문자열 나누기

duswjd_data 2025. 8. 22. 10:28

문제

https://school.programmers.co.kr/learn/courses/30/lessons/140108

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


문제 설명

  • 주어진 문자열 s를 특정 규칙에 따라 여러 개의 문자열로 분해
  • 이때, 분해된 문자열의 개수를 반환하는 함수를 만드시오
  • 분해 규칙
    • 문자열의 첫 글자를 기준 문자 x로 정함
    • 문자열을 왼쪽에서 오른쪽으로 읽으며:
      • x와 같은 문자의 수: count_x
      • x와 다른 문자의 수: count_not_x
    •  count_x == count_not_x가 되는 처음 순간에 분해
    • 남은 문자열에 대해 위 과정을 반복
    • 남은 문자가 없을 때까지 반복하며, 각 분해 구간을 하나로 계산
  • 제한 사항
    1 ≤ s의 길이 ≤ 10,000
    s는 영어 소문자로만 구성
  • 예시 ("aaabbaccccabba"인 경우 aaabbacc - ccab - ba와 같이 분해됨)


정답 코드

def solution(s):
    count = 0
    i = 0

    while i < len(s):
        count_x = 0
        count_not_x = 0
        
        for j in range(i, len(s)):
            if s[j] == s[i]:
                count_x += 1
            else:
                count_not_x += 1 
                
            if count_x == count_not_x:
                break
                
        count += 1
        i = j + 1

    return count

코드 설명

def solution(s):
    count = 0        # 분해한 문자열 개수를 셀 변수
    i = 0            # 현재 탐색을 시작할 인덱스

    while i < len(s):     # 문자열의 끝까지 반복
        count_x = 0       # 현재 분해 중인 문자열에서 x와 같은 글자 수
        count_not_x = 0   # x와 다른 글자 수
        
        # i번째 글자를 x로 지정하고, i부터 끝까지 순회하며 조건 검사
        for j in range(i, len(s)):
            if s[j] == s[i]:       # j번째 글자가 x와 같으면
                count_x += 1
            else:                  # 다르면
                count_not_x += 1 
                
            # x와 같은 글자 수와 다른 글자 수가 같아지면 분리 구간 완성
            if count_x == count_not_x:
                break   # for문 종료
                
        count += 1            # 분리한 문자열 개수 1 증가
        i = j + 1             # 다음 분해 시작 인덱스를 마지막 분해 지점 다음으로 이동

    return count

첫 번째 시도 (실패)

def solution(s):
    count = 0
    i = 0
    count_x = 0
    count_not_x = 0
    
    while i < len(s):
        for j in range(i, len(s)):
            if s[j] == s[i]:
                count_x += 1
            else:
                count_not_x += 1 
            if count_x == count_not_x:
                break
        i = j
        count += 1

    return count

틀린 이유

  • 문제점 1: count_x와 count_not_x가 루프 바깥에서 한 번만 초기화됨
    • 이 변수들은 문자열을 하나 분해할 때마다 새로 세야 하지만, 현재는 값이 계속 누적되는 상태
  •  문제점 2: i = j는 현재 읽은 마지막 문자를 중복해서 다시 읽게 됨
    • 예: j = 3까지 읽었으면, 다음 시작은 i = 4여야 함