알고리즘

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

개발자 박현준 2023. 2. 6. 11:50
728x90

문제 설명

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

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

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

제한사항

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

입출력 예

입출력 예 설명

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

입출력 예 #2
s="abracadabra"인 경우 ab - ra - ca - da - br - a와 같이 분해됩니다.

입출력 예 #3
s="aaabbaccccabba"인 경우 aaabbacc - ccab - ba와 같이 분해됩니다.

코드 설명


import java.util.Scanner;

public class Solution {
	public int solution(String s) {
        int answer = 0;
        int right = 0;
        
        while (right < s.length()) { // right가 s.length 보다 작을경우 반복
        	char c = s.charAt(right); // char c 에 s의right자리 문자를 저장
        	int cCount = 1; // 같은 문자 count를 나 자신도 포함해서 1로 저장
        	int otherCount = 0; // 다른 문자는 0으로 저장
        	while (right + 1 < s.length() && cCount != otherCount) { // right + 1이 s.length 보다 작거나 같은문자랑 다른문자의 개수랑 다르면
        		right++; // right 1증가
        		if (s.charAt(right) == c) { // s의 rigth자리 문자가 c문자랑 같으면 같은문자 1증가
					cCount++;
				}	
        		else { // 아니면 다른문자 1증가
        			otherCount++;
        		}
        	}
        	answer++; // 반복문 돌 때 마다 answer 1증가
        	right++;  // right 1증가
        }
        
        return answer;
        // ex) s = "banana"이면 일단 right = 0이므로 첫번째 while문 동작
        // cCount = 1, otherCount = 0이므로 두번째 while문 동작 
        // c = 'b', right = 1 s의 1자리 문자랑 c랑 다르므로 otherCount = 1 / 두번째 반복문에서 cCount != otherCount에 맞지 않으므로 종료
        // answer = 1, right = 2 
        
        // right = 2이므로 첫번째 while문 동작
        // c = 'n',cCount = 1, otherCount = 0이므로 두번째 while문 동작 
        // right = 3 s의 3자리 문자랑 c랑 다르므로 otherCount = 1 / 두번째 반복문에서 cCount != otherCount에 맞지 않으므로 종료
        // answer = 2, right = 4 
        
        // right = 4이므로 첫번째 while문 동작
        // c = 'n',cCount = 1, otherCount = 0이므로 두번째 while문 동작 
        // right = 5 s의 5자리 문자랑 c랑 다르므로 otherCount = 1 / 두번째 반복문에서 cCount != otherCount에 맞지 않으므로 종료
        // answer = 3, right = 6        
        // right < s.length() 가 맞지 않으므로 모든 실행 종료
        
        
        
        // ex.) s = aaabbaccccabba 이면 일단 right = 0이므로 첫번째 while문 동작
     	// 두번째 while문 동작 c = 'a' right = 1 s의 1자리 문자랑 c랑 같으므로 cCount = 2,
        // right = 2 s의 2자리 문자랑 c랑 같으므로 cCount = 3, right = 3 , s의 3자리 문자랑 c랑 다르므로 otherCount = 1,
     	// right = 4 s의 4자리 문자랑 c랑 다르므로 otherCount = 2, right = 5, s의 5자리 문자랑 c랑 같으므로 cCount = 4, 
        // right = 6 s의 6자리 문자랑 c랑 다르므로 otherCount = 3 
     	// right = 7 s의 7자리 문자랑 c랑 다르므로 otherCount = 4  / 두번째 반복문에서 cCount != otherCount에 맞지 않으므로 종료 aaabbacc까지 끊기고 
        // answer = 1 right = 8

        // right = 8이므로 첫번째 while문 동작
     	// c = 'c' right = 9  s의 9자리 문자랑 c랑 같으므로 cCount = 2, right = 10 s의 10자리 문자랑 c랑 다르므로 otherCount = 1
     	// right = 11, s의 11자리 문자랑 c랑 다르므로 otherCount = 2  / 두번째 반복문에서 cCount != otherCount에 맞지 않으므로 종료 ccab까지 끊기고 
        // answer = 2 right = 12
        
        // right = 12이므로 첫번째 while문 동작
     	// c = 'b' right = 13 s의 13자리 문자랑 c랑 다르므로 otherCount = 1  / 두번째 반복문에서 cCount != otherCount에 맞지 않으므로 종료 ba까지 끊기고 
        // answer = 3 right = 14
        // right < s.length() 가 맞지 않으므로 모든 실행 종료
    }
	public static void main(String[] args) {
		Solution T = new Solution();
		Scanner sc = new Scanner(System.in);
		String s = sc.next();
		System.out.println(T.solution(s));
		sc.close();
	}
}
728x90