
문제
https://school.programmers.co.kr/learn/courses/30/lessons/140108
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 설명
- 주어진 문자열 s를 특정 규칙에 따라 여러 개의 문자열로 분해
- 이때, 분해된 문자열의 개수를 반환하는 함수를 만드시오
- 분해 규칙
- 문자열의 첫 글자를 기준 문자 x로 정함
- 문자열을 왼쪽에서 오른쪽으로 읽으며:
- x와 같은 문자의 수: count_x
- x와 다른 문자의 수: count_not_x
- count_x == count_not_x가 되는 처음 순간에 분해
- 남은 문자열에 대해 위 과정을 반복
- 남은 문자가 없을 때까지 반복하며, 각 분해 구간을 하나로 계산
- 제한 사항
1 ≤ s의 길이 ≤ 10,000
s는 영어 소문자로만 구성 - 예시 ("aaabbaccccabba"인 경우 aaabbacc - ccab - ba와 같이 분해됨)


정답 코드
def solution(s):
count = 0
i = 0
while i < len(s):
count_x = 0
count_not_x = 0
for j in range(i, len(s)):
if s[j] == s[i]:
count_x += 1
else:
count_not_x += 1
if count_x == count_not_x:
break
count += 1
i = j + 1
return count
코드 설명
def solution(s):
count = 0 # 분해한 문자열 개수를 셀 변수
i = 0 # 현재 탐색을 시작할 인덱스
while i < len(s): # 문자열의 끝까지 반복
count_x = 0 # 현재 분해 중인 문자열에서 x와 같은 글자 수
count_not_x = 0 # x와 다른 글자 수
# i번째 글자를 x로 지정하고, i부터 끝까지 순회하며 조건 검사
for j in range(i, len(s)):
if s[j] == s[i]: # j번째 글자가 x와 같으면
count_x += 1
else: # 다르면
count_not_x += 1
# x와 같은 글자 수와 다른 글자 수가 같아지면 분리 구간 완성
if count_x == count_not_x:
break # for문 종료
count += 1 # 분리한 문자열 개수 1 증가
i = j + 1 # 다음 분해 시작 인덱스를 마지막 분해 지점 다음으로 이동
return count
첫 번째 시도 (실패)
def solution(s):
count = 0
i = 0
count_x = 0
count_not_x = 0
while i < len(s):
for j in range(i, len(s)):
if s[j] == s[i]:
count_x += 1
else:
count_not_x += 1
if count_x == count_not_x:
break
i = j
count += 1
return count
틀린 이유
- 문제점 1: count_x와 count_not_x가 루프 바깥에서 한 번만 초기화됨
- 이 변수들은 문자열을 하나 분해할 때마다 새로 세야 하지만, 현재는 값이 계속 누적되는 상태
- 문제점 2: i = j는 현재 읽은 마지막 문자를 중복해서 다시 읽게 됨
- 예: j = 3까지 읽었으면, 다음 시작은 i = 4여야 함
'코딩 테스트 연습 > [프로그래머스] Python' 카테고리의 다른 글
| -- 9월 프로젝트 집중 기간 -- (0) | 2025.08.31 |
|---|---|
| [LV.4] 연습문제 > 대충 만든 자판 (4) | 2025.08.27 |
| [LV.3] 탐욕법(Greedy) > 체육복 (0) | 2025.08.20 |
| [LV.3] 연습문제 > 숫자 짝꿍 ⭐️ (3) | 2025.08.18 |
| [LV.3] 연습문제 > 옹알이 (2) (3) | 2025.08.14 |