새소식

⌨️ Algorithms/프로그래머스

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

2022. 12. 31. 13:05

  • -

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

 

프로그래머스

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

programmers.co.kr

 

  • 문자열 s가 입력되었을 때 다음 규칙에 따라 이 문자열을 여러 문자열로 분해
    • 먼저 첫 글자를 읽음. 이 글자를 x라고 함
    • 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 x가 아닌 다른 글자들이 나온 횟수를 각각 카운트. 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리
    • s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복. 남은 부분이 없다면 종료
    • 만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료
  • 분해한 문자열의 개수를 return

제한사항

  • 1 ≤ s의 길이 ≤ 10,000
  • s는 영어 소문자로만 이루어져 있음

 

"""
입출력 예시)

s = "banana" -> 3
s = "abracadabra" -> 6
s = "aaabbaccccabba" -> 3
"""

 

# s "banana" -> 3
#  ba - na - na

# s "abracadabra" -> 6
# ab - ra - ca - da - br - a

# s "aaabbaccccabba" -> 3
# aaabbacc - ccab - ba

 

 

## 의사코드 ##

# 결과를 담을 리스트 생성 ['', 0, 0] -> 문자열x, x가 나온 횟수, x가 아닌 문자가 나온 횟수

# for i in s:
#   if 리스트[0] == '': (문자열이 비어있으면)
#       리스트[0] = i (s의 첫 번째 문자가 x가 됨)
#       리스트[1] += 1 (x가 나온 횟수 + 1)
#   else: (문자열이 비어있지 않은 경우 -> x가 지정되어 있을 때)
#       if 리스트[0] == i: (현재 문자가 x이면)
#           리스트[1] += 1 (x가 나온 횟수 + 1)
#       else: (현재 문자가 x가 아니면)
#           리스트[2] += 1 (x가 아닌 문자가 나온 횟수 +1)
#       if 리스트[1] == 리스트[2]: (x가 나온 횟수와 x가 아닌 문자가 나온 횟수가 같으면)
#           answer += 1 (분해한 문자열의 개수 + 1)
#           리스트 = ['', 0, 0] (리스트 초기화)
#  if 리스트 != ['', 0, 0]: (리스트가 초기화된 리스트가 아니면 => 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없는 경우)
#   answer += 1 (지금까지 읽은 문자열을 분리)

 

 

 

통과한 코드

 

def solution(s):
    answer = 0
    temp = ["", 0, 0] # 문자열x, x가 나온 횟수, x가 아닌 문자가 나온 횟수

    for i in s:
        # 문자열이 비어있는 경우 -> x가 아직 지정되지 않았을 때
        if temp[0] == "":
            temp[0] = i # x는 현재 문자 (s의 첫 번째 문자)
            temp[1] += 1 # x가 나온 횟수 + 1
        # 문자열이 비어있지 않은 경우 -> x가 지정되어 있을 때
        else:
            # 현재 문자가 x이면
            if temp[0] == i:
                temp[1] += 1 # x가 나온 횟수 + 1
            # 현재 문자가 x가 아니면
            else:
                temp[2] += 1 # x가 아닌 문자가 나온 횟수 +1

            # x가 나온 횟수와 x가 아닌 문자가 나온 횟수가 같으면
            if temp[1] == temp[2]:
                answer += 1 # 분해한 문자열의 개수 + 1
                temp = ["", 0, 0] # 리스트 초기화

    # 리스트가 초기화된 리스트가 아니면 -> 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없는 경우
    if temp != ["", 0, 0]:
        answer += 1 # 지금까지 읽은 문자열을 분리, 분해한 문자열의 개수 + 1
    
    return answer

 

처음에는 문자열 x를 구하고, s의 i번째 문자와 i+1번째 문자를 비교해서 나온 횟수를 카운트 한 다음, 

분해 조건을 만족하면 분해한 문자열을 따로 리스트에 저장해서 answer = len(리스트)로 하려고 했다.

 

근데 그냥 리스트 하나로 한번에 바로 문자열 x와 x가 나온 횟수, x가 아닌 문자가 나온 횟수를 저장하면 훨씬 쉽게 풀 수 있었다. 

 

 

  • 과정 확인
s = "aaabbaccccabba"
solution(s)

"""
temp[0]: a # 문자열 x
temp: ['a', 1, 0]
___________________________
temp[0]: a
i: a
temp: ['a', 2, 0] 

temp[0]: a
i: a
temp: ['a', 3, 0] 

temp[0]: a
i: b
temp: ['a', 3, 1] 

temp[0]: a
i: b
temp: ['a', 3, 2] 

temp[0]: a
i: a
temp: ['a', 4, 2] 

temp[0]: a
i: c
temp: ['a', 4, 3] 

temp[0]: a
i: c
temp: ['a', 4, 4] 

temp: ['', 0, 0] # 리스트 초기화
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

temp[0]: c # 문자열 x
temp: ['c', 1, 0]
___________________________
temp[0]: c
i: c
temp: ['c', 2, 0] 

temp[0]: c
i: a
temp: ['c', 2, 1] 

temp[0]: c
i: b
temp: ['c', 2, 2] 

temp: ['', 0, 0] # 리스트 초기화
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

temp[0]: b # 문자열 x
temp: ['b', 1, 0]
___________________________
temp[0]: b
i: a
temp: ['b', 1, 1] 

temp: ['', 0, 0] # 리스트 초기화
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

3
"""

 

 

 

참고)

 

https://khomep.shop/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%AC%B8%EC%9E%90%EC%97%B4%EB%82%98%EB%88%84%EA%B8%B0-%EB%AC%B8%EC%A0%9C-python/

 

프로그래머스 - 문자열나누기 문제 Python - Zzrany Blog

여기는 Python을 공부하며 학습한 내용을 정리하는 블로그입니다. 해당 포스팅에서는 프로그래머스 문자열나누기 문제를 풀고 풀이하여 연습시 참고하실 수 있도록 필요한 내용만 간략하게 정리

khomep.shop

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다!