[프로그래머스] LV.1 문자열 나누기

seho·2023년 3월 14일
0

codetest

목록 보기
17/17
post-thumbnail

문제

문자열 s가 입력되었을 때 다음 규칙을 따라서 이 문자열을 여러 문자열로 분해하려고 합니다.

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

제한사항

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

입출력 예시

s					result
"banana"			3
"abracadabra"		6
"aaabbaccccabba"	3

풀이

이중 for문을 사용하고 마지막 나머지 문자들을 처리하느라 시간이 좀 오래걸리고 고생한 코드이다.
1. for문으로 문자열의 문자들을 꺼내어 비교해주고
2. 문자들을 사용한 후에 입력값 s를 사용한 문자들을 제거 후 재 사용해주는 재귀용법이다.
3. 조건대로 문자열이 생성이 안되더라도 나머지 문자들을 처리해주는 방법 또한 고려해야한다.

def solution(s):
    answer = []
    s2 = ''
    
    for s1 in s:    
        s2+=s1
        if s2.count(s2[0]) == len(s2)/2 or len(s) == 1 or len(s2) == len(s):
            s = s[len(s2):]
            answer.append(s2)
            s2 = ''

    return len(answer)
  • 먼저 answer 변수를 리스트로 설정해준다. 이 리스트에 해당되는 문자열을 넣은 후 개수를 세어 리턴해줄 것이다.
  • 변수 s2는 새롭게 생성되는 문자열로 초기화를 먼저 해준다.
  • for문으로 문자열 s에서 한 문자씩 빼내어 s1 변수에 담고 사용해준다.
  • 새롭게 생성되는 문자열 s2s1을 계속 더해주어 문자열을 새롭게 생성해주고
  • 만약 새롭게 생성된 s2 문자열에서 첫 번째 문자 s2[0]의 개수가 s2의 총 문자 개수의 절반과 같다면 if문에 들어가도록 해준다. if문에 들어가게되면 문자열 s에서 s2를 빼내어 다시 정의해주고 answer변수에 s2를 추가해주며 s2를 초기화해준다.
  • 이 때, if문의 다른 조건이 두 개 더 있는데 첫 번째는 문자열 s가 마지막 문자 한 개를 빼고 나머지가 다 추출 되었을 때 해당 한 개의 문자를 answer에 추가해주는 조건문이고,
  • 다음은 제시된 조건에서 "만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다."이라는 조건을 충족시키기 위한 것으로 나머지 문자열이 먼저 제시된 조건들을 충족 못하더라도 answer에 추가해주도록 한다.(예시 s = 'baaa' 가 있다.)

오답노트

  • for 문을 두 개를 사용해야만 문자들을 비교할 수 있을 줄 알았는데 변수를 사용하여 비교할 수 있음을 다시 알게 되었다.
  • 조건들이 복잡하게 엮여있는데 마지막 나머지 문자들을 처리할 수 있어야한다. 체점을 돌리지 않고도 발견 할 수 있는 실력과 세심함이 있어야할 것 같다.
profile
develop my'self and sw

0개의 댓글