[Programmers/Lv. 1] 문자열 나누기 (프로그래머스 연습문제, Python)

2023. 8. 8. 17:23Algorithm

📎 링크


 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

🤔 문제설명, 제한사항, 입출력 예


주어진 문자열 s를 아래 규칙에 따라서 분해하고, 분해된 문자열의 개수를 구하라는 문제이다.

  • 문자열 s의 첫 글자를 x라고 한다. (문자열 s는 소문자로만 이루어진다.)
  • 문자열을 읽어나가면서 x가 나온 횟수와 x가 아닌 글자가 나온 횟수를 카운트한다.
  • 처음으로 두 횟수가 같아지는 순간 (0 제외) 이 카운트를 멈추고, 지금까지 읽은 문자열을 분리한다.
  • 분리된 문자열을 빼고, 남은 부분에 대해서 "첫 글자를 읽고 -> 문자별 나온 횟수 카운트" 과정을 반복한다.
  • 두 카운트가 다른 상태에서 (0 포함) 더 이상 읽을 글자가 없다면, 남은 문자열을 분리하고 반복을 종료한다.

 

 

🤔 내가 생각한 풀이 과정


첫 문자 x를 저장하고 문자열을 문자 하나씩 반복하면서, x와 같은 문자인지 비교해 준다.
만약 반복하는 문자가 x와 같은 문자라면, x_count를 1 증가시킨다. 반대인 경우에는, non_x_count를 1 증가시킨다.
이때, x_count와 non_x_count 두 값이 모두 1 이상이면서, 서로 같은지를 계속 같이 확인해 준다.
만약 두 값이 같아졌다면, 첫 문자를 다음 인덱스의 문자로 저장하고 x_count와 non_x_count를 0으로 초기화시켜 준다.
최종으로 반환할 문자열의 개수 answer의 변수 값도 같이 1 증가시켜 준다.

이때 중요한 점은, 최종으로 반환할 answer의 초기값이 0이 아니라 1로 설정되었다는 점이다.
내 코드에서는 리스트의 Out of Range 오류를 방지하기 위해 문자열의 반복 범위를 len(s)-1까지로 설정했는데, 그 이유는 x를 새로 설정하는 부분이 인덱스 값보다 1 큰 값을 지정하는 코드와 연관되어 있다.

만약, 문자열의 마지막 부분에서 x_count와 non_x_count 값이 같아진다고 했을 때,
다음 x 문자는 현재 인덱스 다음 값으로 지정이 되는데, 마지막 부분이라면 현재 인덱스의 다음 값은 존재할 수 없다.
즉, 이런 상황에서 리스트의 범위를 벗어나는 Out of Range 오류가 발생하게 되는 것이다.

그러므로, 마지막으로 남을 문자를 애초에 반복하지 않고,
그 문자로 인해 문자열이 분리가 되든지 아니든지 상관없이 나는 무조건 별도의 문자열 1개가 분리된다고 가정을 했기에 answer의 초기값이 0이 아닌 1로 설정을 할 수 있었다.

 

 

👨‍💻 코드


def solution(s):
    answer = 1
    x = s[0]
    x_count = non_x_count = 0
    
    for i in range(len(s)-1):
        
        if s[i] == x: 
            x_count += 1
        else:
            non_x_count += 1
            
        if x_count >= 1 and x_count == non_x_count:
            answer += 1
            x = s[i+1]
            x_count = non_x_count = 0   
        
    return answer