코딩테스트

문자열 나누기 문제 회고

Vetenir 2025. 2. 4. 20:27

입출력 예 #1
s="banana"인 경우 ba - na - na와 같이 분해됩니다.

통과된 코드

#include <string>
#include <vector>

using namespace std;

int solution(string s) {
    int answer = 0;
    int cnt = 0, df_cnt = 0;
    char first = s[0];
    
    for (int i = 0; i < s.size(); i++) {
        if (cnt == 0) {
            first = s[i];
        }
        
        if (s[i] == first) {
            cnt++;
        } else {
            df_cnt++;
        }
        
        if (cnt == df_cnt) {
            answer++;
            cnt = 0;
            df_cnt = 0;
        }
    }
    
    if (cnt != 0) {
        answer++;
    }
    
    return answer;
}

 

틀린 코드 분석

아래의 코드는 통과하지 못한 이전의 코드입니다.

#include <string>
#include <vector>

using namespace std;

int solution(string s) {
    int answer = 0;
    int i = 0;
    int cnt = 0;
    int df_cnt = 0;
    vector<char> v;
    
    for(int j = 1; j <= s.size(); j++)
    {
        if(v.size() == 0)
        {
            v.push_back(s[i]);
            cnt++;
        }
        if(s[j] != v[0])
        {
            v.push_back(s[j]);
            df_cnt++;
        }
        if(s[j] == v[0])
        {
            v.push_back(s[j]);
            cnt++;
        }
        if(cnt == df_cnt)
        {
            i = cnt + df_cnt;
            j = cnt + df_cnt;
            answer++;
            v.clear();
        }
    }
    if (v.size() != 0) {
        answer++;
    }
    return answer;
}

 

결론부터 말하자면 vector를 사용한 것이 가장 큰 문제였습니다.

 

저 코드를 작성할 당시에는 문자를 분리해서 저장하고 있어야 한다는 생각에 사로잡혀서

분리된 문자열을 vector로 저장하고

분리된 만큼 string s 인덱스 접근을 다시 해줘야 한다는 생각을 하면서 코드가 너무 복잡해 졌습니다.

그래서 결과적으로 오류를 찾아내기 힘들 정도로 코드를 읽기 힘들어졌습니다.

 

앞으로는 문제를 꼼꼼히 분석하고 요구하는 바를 정확히 이해하고

생각을 정리한 뒤에 코드를 작성하기 시작해야 할 것 같습니다.

그리고 편하다고 무작정 vector를 사용하는 습관을 줄여야할 것 같습니다.