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

최지나·2023년 10월 28일
1

코딩테스트

목록 보기
58/154

문제

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

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

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

제한사항

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

입출력 예

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

문제 출처

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

생각

  • 문자열이 나누어지는 횟수를 count할 변수(splictCnt), x와 같은 문자의 수를 셀 변수(sameCnt), x와 다른 문자의 수를 셀 변수(diffCnt)를 따로 선언하자
  • x 변수를 업데이트할 변수 temp도 필요
  • 문자열의 시작이거나, 문자열이 나눠진 이후 첫 시작은 sameCnt가 0인 걸로 구분하자
  • "시작"인 경우 x 변수 업데이트, sameCnt 증가
  • "시작"이 아닌 경우
    • x랑 동일하면 sameCnt 증가
    • x랑 다르면 diffCnt 증가
      • diffCnt와 SameCnt가 같아지면 문자열 분리, same&diff Cnt 초기화
  • 마지막에 남아있는 문자열들이 있는지는 same|diff Cnt가 0보다 큰지를 통해 확인

코드

class Solution {
    public int solution(String s) {
        int splitCnt = 0;
        int sameCnt = 0;
        int diffCnt = 0;
        String temp = "";
        for (int i = 0 ; i < s.length(); i++){
            if (sameCnt == 0) {
                temp = String.valueOf(s.charAt(i));
                sameCnt++;
            } else {
                if (temp.equals(String.valueOf(s.charAt(i)))){
                    sameCnt++;
                } else {
                    diffCnt++;
                    if (sameCnt == diffCnt){
                        splitCnt++;
                        sameCnt = 0;
                        diffCnt = 0;
                    }
                }
            }
        }
        if (sameCnt > 0 || diffCnt > 0){
            splitCnt++;
        }
        return splitCnt;
    }
}

다른 사람의 풀이

public class Solution {
    public int solution(String s) {
        int answer = 0;
        char init = s.charAt(0);
        int count = 0;
        for (char c : s.toCharArray()) {
            if (count == 0) {
                init = c;
            }
            if (init == c) {
                count++;
            } else {
                count--;
            }
            if (count == 0) {
                answer++;
            }
        }

        if(count > 0) {
            answer++;
        }
        return answer;
    }
}
  • 로직은 유사하나, sameCnt, diffCnt 2개의 변수를 사용한 나의 풀이와 달리 count 변수 하나의 증감으로 처리한 풀이를 기록한다
  • 변수의 개수가 하나 줄었을 뿐인데 더 깔끔하다,, 불필요한 변수를 쓰고 있지는 않은지 생각하면서 코딩해야겠다,,!🐈🐈
profile
의견 나누는 것을 좋아합니다 ლ(・ヮ・ლ)

0개의 댓글