Algorithm/Programmers

[프로그래머스] 코딩테스트 연습 - 문자열 나누기(Java, C)

코끼리 개발자 2022. 12. 4. 00:31
728x90
SMALL

-링크

https://school.programmers.co.kr/learn/courses/30/lessons/140108?language=c 

 

프로그래머스

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

programmers.co.kr

 

 

-문제 설명

문자열 s가 입력되었을 때 다음 규칙을 따라서 이 문자열을 여러 문자열로 분해하려고 합니다.

  • 먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다.
  • 이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 x가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다.
  • s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복합니다. 남은 부분이 없다면 종료합니다.
  • 만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다.

문자열 s가 매개변수로 주어질 때, 위 과정과 같이 문자열들로 분해하고, 분해한 문자열의 개수를 return 하는 함수 solution을 완성하세요.

 

 

-제한 사항

  • 1 ≤ s의 길이 ≤ 10,000
  • s는 영어 소문자로만 이루어져 있습니다.

 

-입출력 예

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

 

 

-해설

첫 시작은 문자열 첫번째 문자부터 비교를 시작하면 된다.

입출력 예 #3으로 예시를 들으면, "aaabbaccccabba"인 경우 첫 문자는 'a'이고, 'a'와 'a'가 아닌것으로 카운팅을 시작하면 된다.

카운팅을 시작하면 aaabbacc까지 읽었을 때, 'a'의 개수가 4개 'a'가 아닌 문자의 개수 4개로 개수가 동일해 지므로, 이때 answer에 카운팅을 하면 된다.

즉, "aaabbacc"문자열이 끊어졌다 라고 생각하면 된다. 그 다음 "ccabba"를  문자열의 시작으로 간주하여 첫 문자를 'c'으로 세팅하고 'c'와 'c'가 아닌 문자열로 다시 카운팅을 시작하고 ccab까지 읽었을 때 'c'의 개수 2개 'c'가 아닌 개수 2개로 동일해 지므로 다시 answer에 카운팅을 하고 위와 같은 방법으로 다시 카운팅을 시작하면 된다.

하지만 입출력 예 #3의 경우 입출력 #1과 입출력 #3과 같이 알맞게 계산이 되지 않는다.

이 경우 카운팅을 하고 남은 마지막의 경우의 수를 카운팅하여 answer를 도출하면 된다.

ex) "aabbaabbccaadaaad" -> aabb - aabb - ccaa - daaad가 됨 마지막 "daaad"로 카운팅을 할 때 dd는 2개지만 aaa는 3개로 맞아떨어지지 않으므로 문자열 한개로 간주하고 answer에 카운팅을 한다.

 

 

-풀이(Java)

class Solution {
    public int solution(String s) {
        int answer = 0;
        char ch = '\0';
        int ch_cnt = 0;
        
        for(int i = 0; i < s.length(); i++){
            if(ch == '\0')
                ch = s.charAt(i);
            
            if(ch == s.charAt(i))
                ch_cnt++;
            else
                ch_cnt--;
            
            if(ch_cnt == 0){
                answer++;
                ch = '\0';
            }
            else if(s.length() == i+1)
                answer++;
        }
        return answer;
    }
}

 

 

-풀이(C)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요.
int solution(const char* s) {
    int answer = 0;
    int cnt = 0;
    char first_ch = s[0];
    
    for(int i = 0; i < strlen(s); i++){
        if(first_ch == '\0')
            first_ch = s[i];
        
        if(first_ch == s[i]){
            cnt++;
        }else{
            cnt--;
        }
        
        if(cnt == 0){
            answer++;
            first_ch = '\0';
        }else if(strlen(s) -1 == i)
        {
            answer++;
        }
    }
        
    return answer;
}

728x90
LIST