알고리즘
[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