문제 설명
문자열 s가 입력되었을 때 다음 규칙을 따라서 이 문자열을 여러 문자열로 분해하려고 합니다.
- 먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다.
- 이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 y가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다.
- s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복합니다. 남은 부분이 없다면 종료합니다.
- 만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다.
문자열 s가 매개변수로 주어질 때, 위 과정과 같이 문자열로 분해하고, 분해한 문자열의 개수를 return 하는 함수 solution을 완성하세요.
제한사항
- 1<=s의 길이<=10,000
- s는 소문자로만 이루어져 있습니다.
입출력 예
s | result | 설명 | ||
"banana" | 3 | s="banana"인 경우 ba - na - na와 같이 분해됩니다. | ||
"abracadabra" | 6 | s="abracadabra"인 경우 ab - ra - ca - da - br - a와 같이 분해됩니다 | ||
"aaabbaccccabba" | 3 | s= "aaabbaccccabba"인 경우 aaabbacc - ccab - ba와 같이 분해됩니다. |
문제 풀이
풀이 언어 : C++
#include <string>
#include <vector>
using namespace std;
int solution(string s) {
int answer = 0;
char x=s[0]; // 첫 글자
int count_x=0; // 첫 글자 수
int count_notx=0; // 첫 글자와 다른 글자 수
for(int i=0; i<s.length(); i++)
{
if(s[i]==x) // 첫 글자와 같다면
{
count_x++;
}
else // 첫 글자와 다르다면
{
count_notx++;
}
// 첫 글자 수와 다른 글자 수가 같다면
if(count_x==count_notx)
{
// 문자열 수 업데이트
answer++;
// 변수 초기화
x=s[i+1];
count_x=0;
count_notx=0;
}
else if(i==s.length()-1) // 글자수가 다른데 마지막 글자라면
{
// 문자열 수 업데이트
answer++;
}
}
return answer;
}
문제에서 하라는대로 코드로 표현하기만 하면 되는 문제라서 어려운 문제는 아니었다. 마지막에 하나만 신경써주면 될 것 같아 보인다.
먼저 필요한 변수들을 선언한다. 첫 글자를 담을 변수 x는 s의 첫글자로 초기화한다. x의 개수를 담을 count_x 그리고 x가 아닌 다른 글자의 수를 담을 변수 count_notx를 선언하고 0으로 초기화한다.
이제 반복문을 이용해 x의 개수와 x가 아닌 글자의 개수를 구하고 두 개수가 같아질 때 문자열을 쪼개면 된다. s[i]가 x라면 count_x의 값을 증가시키고, x가 아니라면 count_notx의 값을 증가시킨다. 그 다음 count_x와 count_notx가 같은지 확인하고 같다면 문자열을 쪼개고 사용했던 변수들을 초기화한다. 말이 문자열을 쪼갠다고 하지만 그냥 문자열이 몇개 쪼개졌는지만 return하면 되기 때문에 answer을 하나 증가시켜주면 된다.
이렇게만 하면 문제 그대로를 구현한 것 같아보이지만 사실 한 가지 문제가 있다.
- 만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다.
아직 이 부분이 구현되지 않은 상태이다. 지금 이대로 돌린다면 마지막에 두 횟수가 차이난채로 끝난다면 마지막 문자열은 문자열 갯수에 포함이 되지 않는다. 그래서 글자수가 다른데 만약 이 글자가 마지막 글자일 때의 조건을 추가한다. 글자수는 다른지만 이 글자가 마지막 글자라면 이 또한 문자열 하나로 인정하여 answer을 하나 증가시켜 준다. 마지막에 두 횟수가 딱 맞게 같아 끝난다면 위에 조건을 아니라면 아래 조건의 코드를 실행하면 끝날 것이다.
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/140108
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
'Code KATA > 알고리즘 코드카타' 카테고리의 다른 글
[2025.02.06] 둘만의 암호 (1) | 2025.02.06 |
---|---|
[2025.02.05] 대충 만든 자판 (0) | 2025.02.05 |
[2025.02.03] 체육복 (1) | 2025.02.03 |
[2025.01.31] 로또의 최고 순위와 최저 순위 (0) | 2025.01.31 |
[2025.01.30] 기사단원의 무기 (0) | 2025.01.31 |