알고리즘

[프로그래머스] 문자열 나누기 - 파이썬/python

욘아리 2025. 3. 14. 09:15

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

 

프로그래머스

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

programmers.co.kr

문자열이 주어질 때, 아래의 규칙을 따라서 문자열을 분해하고 분해한 문자열의 개수를 구하는 문제다.

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

 

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

 

예시

Example 1:

s: "banana"
resule: 3

 

Example 2:

s: "abracadabra"
resule: 6

 

Example 3:

s: "aaabbaccccabba"
resule: 3

 

처음 문제를 읽었을 때, 문제가 요구하는 바를 바로 이해하기 어려웠다.

예제들을 보면서 직접 노트에 작성해 보니 이해하는 데 도움이 됐다...........ㅎㅎ 
(문제 이해하는 데 꽤 걸렸던 것 같다..🤣)

 

풀이

문제를 이해한 그대로 구현하려고 노력한 풀이 -> 다소 많은 조건문..

def solution(s):
    answer = 0
    cnt_x, cnt_notx = 0, 0
    x = s[0]
    
    for i in range(len(s)):
        if s[i] == x:
            cnt_x += 1
        else:
            cnt_notx += 1
            
        if cnt_x == cnt_notx:
            answer += 1
            cnt_x, cnt_notx = 0, 0
            if i + 1 < len(s):
                x = s[i+1]
    
    if cnt_x != 0 or cnt_notx != 0:
        answer += 1
        
    return answer
  • 첫 번째 문자(x)를 기준으로 개수를 센다.
    • x와 같은 문자 개수와 다른 문자 개수가 같아지면 answer 증가
  • 마지막에 남은 문자열이 있다면 추가적으로 answer 증가

 

다른 방법 풀이

불필요한 인덱스 접근과 조건문 줄이는 방향으로 개선

def solution(s):
    answer = 0
    cnt_x, cnt_notx = 0, 0
    x = ""
    
    for i in s:
        if cnt_x == cnt_notx:
            x = i
            answer += 1
            cnt_x += 1
        elif x == i:
            cnt_x += 1
        else:
            cnt_notx += 1
        
    return answer