프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
문제 설명
문자열 s가 입력되었을 때 다음 규칙을 따라서 이 문자열을 여러 문자열로 분해하려고 합니다.
◈ 먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다.
◈ 이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 x가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다.
◈ s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복합니다. 남은 부분이 없다면 종료합니다.
◈ 만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다.
문자열 s가 매개변수로 주어질 때, 위 과정과 같이 문자열들로 분해하고, 분해한 문자열의 개수를 return 하는 함수 solution을 완성하세요.
제한사항
◈ 1 ≤ s의 길이 ≤ 10,000
◈ s는 영어 소문자로만 이루어져 있습니다.
입출력 예
s result "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와 같이 분해됩니다.
코딩
#include <string>
#include <vector>
using namespace std;
int solution(string s) {
int answer = 0;
string str_Test = "";
str_Test += s.at(0);
s.erase(s.begin());
while (true)
{
char cTarget = str_Test.at(0);
int iSameCount = 0;
int iDefCount = 0;
for (size_t i = 0; i < str_Test.length(); ++i)
{
if (cTarget == str_Test.at(i))
iSameCount++;
else
iDefCount++;
}
if (iSameCount == iDefCount)
{
answer++;
if (!s.empty())
{
str_Test.clear();
str_Test += s.at(0);
s.erase(s.begin());
}
else
return answer;
}
else
{
if (!s.empty())
{
str_Test += s.at(0);
s.erase(s.begin());
}
else
return ++answer;
}
}
}
우선 해당 문제에 대해 이해를 해야한다.
은근히 문제를 이해하지 못하는 경우가 있는 것 같았다. (저도 문제를 읽고 이해를 잘 못해서 해맸습니다.. ㅠ)
아래 그림을 보면 이해하시는데 도움이 되실겁니다.
저는 검사용으로 자른 문자열을 담을 string str_Test를 선언해주고, 이곳에 s의 첫 문자를 추가해가면서 검사를 진행했습니다.
str_Test의 첫 문자가 검사할 문자 대상인 x가 되고, str_Test의 길이 만큼 반복 수행해 str_Test에서 x와 같은 문자 갯수(iSameCount) 와 다른 문자 갯수(iDefCount)를 모두 구한 후, iSameCount와 iDefCount를 비교해 갯수가 같다면, 문자열이 나뉜 것이므로 answer를 1증가시켜주고, str_Test를 비워준 뒤, s의 다음 문자를 추가해 주었습니다. (s에서 str_Test로 문자를 추가할때는 s의 해당 문자를 지워주었습니다.)
이때, s가 텅비어서 추가할 문자가 없을 경우 문자열 나누기가 끝난 것이므로 answer를 1증가한 뒤 반환해주도록 하였습니다.
iSameCount와 iDefCount가 서로 다르다면, 문자열이 나뉘어지지 않은 것이므로 str_Test에 s의 첫 문자를 추가해 다시 검사를 진행해 주었습니다.
이때, 만약 s가 텅 비어서 다음 문자를 넣어줄 수 없다면, 모든 문자열 나누기를 마쳤다는 뜻이므로 동일하게 answer를 1증가해 반환해주었습니다.
실행 결과
'프로그래밍 > 코딩 문제 풀이' 카테고리의 다른 글
프로그래머스 2023.07.27 (1Lv 이상한 문자 만들기) (0) | 2023.07.27 |
---|---|
프로그래머스 2023.07.26 (1Lv K번째수) (0) | 2023.07.26 |
프로그래머스 2023.07.25 (1Lv 두 개 뽑아서 더하기) (0) | 2023.07.25 |
프로그래머스 2023.07.24 (1Lv 키패드 누르기) (0) | 2023.07.24 |
프로그래머스 2023.07.23 (1Lv 크레인 인형뽑기 게임) (0) | 2023.07.23 |