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

gcoco·2023년 5월 11일
0

안녕하세요! 지치지도 않는 GCOCO입니다!


잡설 한 COOKIE🍪

즐겁습니다.

뭐가요?

바로 포스팅 하는것이!

처음 포스팅을 할 때만 하더라도 들었던 생각은

'헉...누가 지적하거나 뭐라하면 어떡하지??😅'

'나 진짜 코딩 허접인데 내가 이런 글을 써도 되나?'

'뭔가 내 생각을 내비치는것이 너무 부끄러운 것 같아!' 라는 생각들을 하였습니다 만......

놀랍게도 그 누구도 관심을 주지 않았다!

첫 포스팅으로부터 약 3주정도가 지났는데요, 단 하나의 댓글도 하트도 없습니다!

하지만 오히려 이것은 제게 더 나아갈 힘을 주었던 것 같습니다.

다른사람의 눈초리에 신경쓰지 않고 스스로의 의견을 기록해가며 성장일지를 기록하는 것!

캬. 이것이 바로 참된 성장의 과정 아니겠습니까?

무림 고수들이 누군가에게 보여주려고 성장하는 것을 본 적 있으십니까?

아뇨! 그들은 정말로 스스로를 위해 성장합니다!

물론 그렇다고 제가 고수라는 뜻은 아닙니다만... 스스로를 위해 계속 나아가겠습니다!

자! 기운차게! 문제 보시죠!


문제링크 :

옛풀이

익숙한 제목이지요? 이 옛풀이라는 단어가 나온다면 다시 푸는 문제인 것입니다!

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

#include <string>
#include <vector>

using namespace std;

int solution(string s) {
    int answer = 0;
    int me, you;
    me = you = 0;
    char tmp = s[0];//초기값 세팅
    for (int i = 0; i < s.size(); i++) {
        if (tmp == s[i]) {
            me++;//기준과 s[i]가 같으면 me++
        }
        else {
            you++;//기준과 s[i]가 다르면 me++
        }
        
		//같은 값이라면 
        if (me == you) {
        	//초기화 및 answer++;
            //tmp에 다음 글자 세팅
            me = you = 0;
            answer++;
            tmp = s[i + 1];
        }
        //i가 끝값이고 me != you
        else if (i == s.size() - 1 && me != you) {
            answer++;
        }
    }

    return answer;
}

음~ 그렇군요. 코드의 흐름은 다음과 같습니다.

  1. tmp에 초기값을 세팅해준다.
  2. s의 글자를 순회하며
  3. 기준과 현재 글자가 같으면 me++
  4. 다르다면 you++
  5. 같은 값이면 answer++ 및 초기화
  6. 처리가 덜 된것이 남아있다면 answer++

하지만 지적할 포인트가 있습니다.
우선 if(me==you) 부분에서 tmp=s[i+1]과 같이 접근하고 있습니다.
물론 논리적으로는 접근할 일이 없겠다만("abracadabra"의 case를 생각해보시면 될 것 같습니다.)
그래도! index의 범위를 넘어가는 값에 접근할 수도 있는것 자체가 좀 불편합니다!
또한 그 아래 else if로 처리하였기 때문에 사실 && me!=you는 없어도 되는 코드이지요.

새롭게 작성한 코드를 보겠습니다.


새풀이

#include <string>
#include <vector>

using namespace std;

int solution(string s) {
    int answer = 0;
    int num_me, num_not_me;
    char stand,now;
    num_me = num_not_me = 0;
    for(int i=0;i<s.size();i++){
        now = s[i];
        if(!num_me && !num_not_me){
            stand = s[i];
            num_me++;
        }
        else if(stand==now){
            num_me++;
        }
        else{
            num_not_me++;
        }
        
        if(num_me==num_not_me){
            answer++;
            num_me = num_not_me = 0;
        }
    }
    
    if(num_me)
        answer++;
    
    return answer;
}

코딩을 해가면서 확실하게 함수 또는 변수 명만 보고도 무슨 기능을 하는지 알 수 있도록 적으려고 노력하고 있습니다!
아직도 많이 부족한 것이 많지만요.

흐름은 비슷합니다.

허나 이 코드에서 남은것의 처리는 for문의 i의 마지막값일때 처리하는것이 아닌 밖에서 num_me의 값이 남아있는지 체크하는 것으로 확인하였다는 점이 다르겠네요.


작은 도움이 되었다면 다행이겠군요.

감사합니다!

profile
그코코 입니다.

0개의 댓글