728x90
SMALL
프로그래머스 문제 풀이: 문자열 나누기
문제 링크: 문제 보기
문제 설명:
하나의 문자열을 왼쪽부터 읽으면서, 처음 나온 문자와 다른 문자의 수가 같아질 때 분리하여 나눌 수 있는 문자열 개수를 구하는 문제입니다. 이 과정을 반복하여 전체 문자열을 다 나눌 수 있습니다.
문제 해결 코드
#include <string>
#include <vector>
using namespace std;
int solution(string s) {
int answer = 0;
for (int i = 0; i < s.size(); i++) {
if (i == s.size() - 1) { // 마지막 문자까지 왔다면 바로 하나로 분리
answer++;
break;
}
int cnt1 = 1; // 기준 문자 등장 횟수
int cnt2 = 0; // 다른 문자 등장 횟수
for (int j = i + 1; j < s.size(); j++) {
if (s[i] == s[j]) cnt1++;
else cnt2++;
if (cnt1 == cnt2) {
i = j; // i를 j로 옮겨서 다음 구간 시작
answer++;
break;
}
if (j == s.size() - 1) {
i = j; // 끝까지 읽었는데 균형 못 맞춰도 하나로 처리
answer++;
}
}
}
return answer;
}
코드 설명
- 핵심 알고리즘: 왼쪽에서부터 순차적으로 탐색하며 같은 문자 수와 다른 문자 수가 같아지는 순간 분리하는 방식으로 해결합니다.
- 구현 세부사항:
cnt1
은 현재 구간의 기준 문자의 등장 횟수,cnt2
는 나머지 문자의 등장 횟수입니다.- 두 값이 같아지면 하나의 구간으로 분리 가능하므로
answer
를 증가시키고 다음 인덱스로 이동합니다. - 문자열의 마지막까지 도달해도 분리 조건이 안 되면, 그 구간 전체를 하나로 처리합니다.
- 시간 복잡도 분석:
- 최악의 경우 O(n²)이지만, 조건이 맞는 순간 빠르게 분리되기 때문에 평균적으로 O(n)에 가깝습니다.
결과
이 코드는 주어진 문자열을 조건에 맞게 분리하여 가능한 최대 구간 수를 반환합니다. 문제 조건을 그대로 구현하여 직관적이며 효율적인 방식으로 풀이하였습니다.
다른 접근으로는 문자열을 한 번만 순회하며 분리 지점을 찾는 방식이 있지만, 본 방식이 가장 직관적이며 조건에 잘 맞습니다.
728x90
LIST
'programmers' 카테고리의 다른 글
프로그래머스 [연습문제 / 기사단원의 무기](C++) -yes6686- 티스토리 (0) | 2025.04.07 |
---|---|
프로그래머스 [연습문제 / 명예의 전당 (1)](C++) -yes6686- 티스토리 (0) | 2025.04.07 |
프로그래머스 [연습문제 / 가장 가까운 같은 글자](C++) -yes6686- 티스토리 (0) | 2025.03.24 |
프로그래머스 [2023 KAKAO BLIND RECRUITMENT / 개인정보 수집 유효기간](C++) -yes6686- 티스토리 (0) | 2025.03.11 |
프로그래머스 [연습문제 / 둘만의 암호](C++) -yes6686- 티스토리 (0) | 2025.03.08 |