😀 문제 : 문자열 나누기
- 난이도 : Lv.1
- 사용언어 : Python
문제 설명
문자열 s가 입력되었을 때 다음 규칙을 따라서 이 문자열을 여러 문자열로 분해하려고 합니다.
- 먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다.
- 이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 x가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다.
- s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복합니다. 남은 부분이 없다면 종료합니다.
- 만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다.
문자열 s가 매개변수로 주어질 때, 위 과정과 같이 문자열들로 분해하고, 분해한 문자열의 개수를 return 하는 함수 solution을 완성하세요.
제한사항
- 1 ≤ s의 길이 ≤ 10,000
- s는 영어 소문자로만 이루어져 있습니다.
입출력 예
"banana" | 3 |
"abracadabra" | 6 |
"aaabbaccccabba" | 3 |
입출력 예 설명
입출력 예 #1
s="banana"인 경우 ba - na - na와 같이 분해됩니다.
입출력 예 #2
s="abracadabra"인 경우 ab - ra - ca - da - br - a와 같이 분해됩니다.
입출력 예 #3
s="aaabbaccccabba"인 경우 aaabbacc - ccab - ba와 같이 분해됩니다.
풀이 설명
▶ 코드
def solution(s):
answer = 0
idx = 0
cnt = 0
while idx < len(s):
letter = s[idx]
for k in range(idx, len(s)):
if letter == s[k]:
cnt += 1
else:
cnt -= 1
if cnt == 0:
answer += 1
idx += 1
break
idx += 1
else:
if cnt != 0:
answer += 1
return answer
▶ 로직 순서
1. 정해진 문자열 s의 길이(len) 보다 작을 때 while문에서
해당 인덱스(idx)의 값(letter) 가 s[k] 와 일치할 경우, 카운드(cnt)+1해준다.
2. for문의 범위는 idx(0) 부터 문자열 s의 길이(len(s)) 까지이므로 len(s) 전까지 lettter와 s[k] 값을 비교한다.
3. lettter와 s[k] 값이 일치하지 않을 경우, 카운트-1 해준다.
※ 카운트(cnt) !=0 의 의미 : 아직 다른 글자들이 나온 횟수가 일치하지 X
4. 카운트(cnt) ==0 일때, idx에 +1 해서 break 하여 분해된 문자열은 제외시킨다.
5. cnt==0이고 남은 덩어리도 고려해야하므로, while문이 끝나고 cnt!=0일때 덩어리도 answer에 +1 해준다.
▶ 결과
▶ 프로그래머스 사이트
https://school.programmers.co.kr/learn/courses/30/lessons/140108
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr