PS/Programmers

[Programmers Level1] 문자열 나누기(C++)

박땅콩 2022. 12. 4.
728x90

※주의※

저의 풀이가 정답은 아닙니다.

다른 코드가 더 효율적이거나 좋을 수 있습니다.

언제나 다른 사람의 코드는 참고만 하시기 바랍니다.

 

 

[문제 풀이 사이트]

 

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

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

 

 

[문제 풀이]

 

문제에서 주어진 방법대로 풀면된다.

 

1. 먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다.

 

➜ 우선 첫글자인지 판단하는 방법은 boolean 변수(isinit) 값이 true이면 첫 글자이고, false이면 첫글자가 아니다.

➜ 첫 글자인 경우 첫글자를 char 변수(first)에 저장하고 첫 글자와 같은 문자의 개수를 카운트할 변수(samecnt)를 1 증가 시킨다.

그리고 지금까지 읽은 문자열 변수(plus)에 읽은 문자를 추가해준다. 그리고 다음에 읽을 문자가 첫 글자가 아니기 때문에 boolean 변수(isinit)을 false로 변경해준다.

 

 

2. 이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 x가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다.

 

문자열을 읽어나가면서 첫글자와 같은 문자인 경우 samecnt 변수를 1 증가 시키고 지금 까지 읽은 문자열 변수(plus)에 읽은 문자를 추가해준다.

 

문자열을 읽어나가면서 첫글자와 다른 문자인 경우 differcnt 변수를 1 증가 시키고 지금 까지 읽은 문자열 변수(plus)에 읽은 문자를 추가해준다.

그리고 첫 글자와 같은 문자의 개수를 카운트 하는 변수(samecnt)와 첫 글자와 다른 문자의 개수를 카운트 하는 변수(differcnt) 비교한다.

 

만약 첫 글자와 같은 문자의 개수를 카운트 하는 변수(samecnt)와 첫 글자와 다른 문자의 개수를 카운트 하는 변수(differcnt) 변수를 비교했을 때 같다면

➜ string 배열(d)에 지금까지 읽은 문자열 변수(plus)를 추가하고 samecnt, differcnt, plus 변수를 초기화한다.

그리고 다음에 읽을 문자는 첫 글자이기 때문에 첫 글자인지 판단하는 boolean 변수(isinit)를 true로 변경해준다.

 

➜ 만약 첫 글자와 같은 문자의 개수를 카운트 하는 변수(samecnt)와 첫 글자와 다른 문자의 개수를 카운트 하는 변수(differcnt) 변수를 비교했을 때 다르다면 다시 위 과정을 수행한다. 

 

 

3. 만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다.

➜ 같은 문자의 개수를 카운트 하는 변수(samecnt)와 다른 문자의 개수를 카운트 하는 변수(differcnt)가 다르고

현재 읽고 있는 위치(인덱스)가 문자열의 끝일 때 string 배열(d)에 지금까지 읽은 문자열 변수(plus)를 추가한다.

 

4. 분해한 문자열의 개수는 string 배열 변수(d)에 저장되어 있기 때문에 string 배열 변수 사이즈(크기)를 리턴해주면 된다.

 

 

[최종 코드]

 

 

[GitHub]

 

 

 

GitHub - SmallPeanutPark/Programmers: Study Programmers for Coding Test

Study Programmers for Coding Test. Contribute to SmallPeanutPark/Programmers development by creating an account on GitHub.

github.com

 

 

#include <string>
#include <vector>
#include <iostream>

using namespace std;

vector<string> d;

void divideStr(string str) {
    string plus = ""; // 읽은 문자열 
    
    char first = '0'; // 첫글자
    
    int samecnt = 0; // 같은 글자 개수
    int differcnt = 0; // 다른 글자 개수
    
    int len = str.length();
    bool isinit = true;
    for(int i = 0; i < len; ++i) {
        if(isinit == true) {
            // 초기값 읽을 때
            isinit = false;
            first = str[i];
            plus += str[i];
            samecnt += 1;
        } else {
            // 초기값 이후
            if(first == str[i]) {
                samecnt += 1;
                plus += str[i];
            } else {
                // first != str[i] 서로 다른 글자일 때
                differcnt += 1;
                plus += str[i];
                // 같은 글자의 개수와 다른 글자의 개수가 동일할 때 정지
                if(samecnt == differcnt) {
                    // 초기화
                    samecnt = 0;
                    differcnt = 0;
                    d.emplace_back(plus);
                    plus.clear();
                    isinit = true;
                }
            }
        }
        if(samecnt != differcnt) {
                // 두 횟수가 다른 상태
                
                // 더이상 읽을 글자가 없다 -> 문자열의 끝을 의미하는 것으로 보임
                if(i == len - 1) {
                    d.emplace_back(plus);
                }
        }
    }
}

int solution(string s) {
    divideStr(s);
    int answer = d.size();
    return answer;
}

 

 

728x90

댓글