코딩 기록 저장소

[프로그래머스/C++] 문자열 나누기 본문

프로그래머스/Lv.1

[프로그래머스/C++] 문자열 나누기

KimNang 2023. 1. 10. 19:12

문제 정보

제목 : 문자열 나누기

난이도 : Lv.1

사용 언어 : C++

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/140108

 

문제 설명

문자열 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와 같이 분해됩니다.


나의 풀이

첫 글자를 읽을 문자열인 first_s, 각 글자를 비교하여 카운트할 변수 f,d를 선언합니다. 문자열 s의 길이만큼 반복하면서 first_s 문자열이 비어있는 상태라면 s[i] 문자열을 저장한 후 continue합니다. 그리고 만약 s[i]번째 문자열이 first_s와 같다면 f변수에 1을 증가, 같지 않다면 d변수에 1을 증가 시킵니다. 그리고 만약 두 변수의 카운트가 같아진다면 answer 변수에 1을 증가 시킨 후, f,d변수는 0으로 바꾸고 first_s도 비어있는 상태로 바꿔줍니다. 반복이 끝나면 answer을 리턴합니다.

 

코드

#include <string>
#include <vector>

using namespace std;

int solution(string s) {
    int answer = 0;
    int f=0,d=0;
    string first_s="";
    
    for(int i = 0 ; i < s.size(); i++)
    {
        if(first_s == "")
        {
            first_s = to_string(s[i]);
            f++;
            continue;
        }
        
        if (first_s == to_string(s[i]))
            f++;
        else
            d++;

        if( f == d)
        {
            answer++;
            f=0;d=0;
            first_s = "";
        }
        
    }
    
    if ( f != 0)
        answer += 1;
    
    return answer;
}