본문 바로가기

Algorithm/Programers - C++

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

 

Level. 1

 

문제

 

풀이

#include <string>
#include <vector>
#include <iostream>
using namespace std;

int solution(string s) {
    int answer = 0;
    char c = s[0];
    int scount = 1, ocount = 0;
    
    cout <<  "용량 : " <<  s.capacity() << endl; 
    
    
    for(int i=1; i<s.length(); i++){
        
        c == s[i] ? scount++ : ocount++;
        
        if(scount == ocount){
            scount = 0;
            ocount = 0;
            answer ++;
            c = s[i+1];
        }
    }
    
    if(scount > 0) answer ++ ;

    return answer;
}

 

string의 char 요소에 접근할 때 코어덤프가 나지 않길래 왜일까 하고 찾아봤는데

string과 vector는 미리 용량을 크게 할당받는다는 사실을 알았다. 

new와 delete의 사용을 줄이기 위해서라고 한다. 

 

string 의 길이와 용량

길이(size) 

  • C스타일 문자열 char*은 문자열의 끝을 표시하기 위하여 뒤에 \0이 붙어있다.  
  • C++의 string에서는 해당 문자가 붙지 않는데, string 클래스에서 문자열 길이를 자체적으로 가지고 있기 때문이다. 
  • size(), length()를 통해 확인할 수 있다. 
  • C의 경우 \0에 의해 size가 length(글자수)보다 1만큼 더 크다.

용량(capacity)

  • string과 vector는 용량이 추가되거나 줄어들 것을 고려하여 용량을 할당받는다.

 


다른 사람 풀이

#include <string>
#include <vector>

using namespace std;

int solution(string s) {
    int answer = 0,nFirst=1,nSecond=0,nTmp=0;
    char x = s[0];
    bool bBool = false;

    if(s.size()== 1){
        return 1;
    }

    for(int i=1; i<s.size(); i++){
        s[i] == x ? nFirst++ : nSecond++;
        if(nFirst == nSecond){ 
            x = s[i+1];
            nFirst = 1;
            nSecond =0;
            answer ++;
            i++;
        }

        if(i == s.size()-1){
            answer ++;
        }
    }
    return answer;
}

 

 

 

 


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