728x90

문제 설명

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

제한사항

  • 1 ≤ s의 길이 ≤ 10,000
  • s는 영어 소문자로만 이루어져 있습니다.
s = "banana"
s1 = "abracadabra"
s2 = "aaabbaccccabba"
s3 = 'aaa'

# 위에서 부터 각각 3, 6, 3, 1이 나와야한다.
def solution(s):
    answer = 0

    # s를 리스트로 만든다.
    s = list(s)

    # 같은 요소를 넣을 same과 다른 요소를 넣을 dif를 만든다.
    same = []
    dif = []

    # s가 True 즉 존재하면 계속 반복한다.
    while s:
        # s의 맨 처음 요소를 same에 pop하여 집어넣는다.
        # 이때 s의 맨 처음 요소는 사라진다.
        same.append(s.pop(0))

        # s의 길이만큼 반복한다.
        # 이때 변수가 필요 없으므로 "_"를 사용한다.
        for _ in range(len(s)):

            # 만약 same과 dif의 길이가 같으면 반복을 종료한다.
            if len(same) == len(dif):
                break
            # 만약 s의 첫번째 요소와 same의 첫번째 요소가 같으면
            # same의 마지막요소로 집어넣는다.
            # 이때 s의 첫요로를 pop해서 가져오므로 s의 첫 요소는 사라진다.
            elif s[0] == same[0]:
                same.append(s.pop(0))
            # 만약 s의 첫번째 요소와 same의 첫번째 요소가 다르면
            # dif의 마지막요소로 집어넣는다.
            # 이때 s의 첫요로를 pop해서 가져오므로 s의 첫 요소는 사라진다.    
            elif s[0] != same[0]:
                dif.append(s.pop(0))

        # same과 dif의 길이가 같아 반복이 종료되면
        # same과 dif의 요소를 모두 제거한다.
        same.clear()
        dif.clear()
        # answer에 1을 더한다.
        answer += 1
        # 다시 while시작 지점으로 가는데
        # 만약 s가 존재하면 계속 while을 반복하고
        # s가 존재하지 않으면 while을 종료한다.
    return answer
# 함수를 실행하면 예측한 값이 정상 출력된다.
print(solution(s))
print(solution(s1))
print(solution(s2))
print(solution(s3))

# 3, 6, 3, 1

다른 사람의 풀이

def solution(s):
    answer = 0
    
    # sav1과 sav2변수를 만듭니다.
    sav1=0
    sav2=0
    
    # for문을 돌려 s의 요소 하나하나를 i에 집어넣어 반복 실행 합니다.
    for i in s:
        
        # 만약 sav1과 sav2가 같다면
        if sav1==sav2:
            # asnwer에 1을 더하고
            answer+=1
            # i의 값을 a라는 변수를 만들어 집어 넣습니다.
            a=i
        # 만약 i와 a가 같다면
        if i==a:
            # sav1에 1을 더하고
            sav1+=1
        # 같지 않다면
        else:
            # sav2에 1을 더합니다.
            sav2+=1
    return answer
print(solution(s))
print(solution(s1))
print(solution(s2))
print(solution(s3))

# 3, 6, 3, 1
728x90

+ Recent posts