문자열 나누기 라고 제목을 보자마자 toCharArray()써야지~ 하는 생각부터 들었다.
문제의 조건은 아래와 같다.
1. 첫 번째 문자를 기준으로 같은 문자와 다른 문자의 개수를 세어가며 왼쪽에서 오른쪽으로 이동합니다.
2. 같은 문자와 다른 문자의 개수가 같아지면, 그때까지 읽은 구간을 하나의 문자열로 분리하고, 다시 다음 구간을 새로 시작합니다.
3. 남은 문자열이 없을 때까지 과정을 반복합니다.
일단 처음엔 for루프로 처음 문자(char)를 기준으로 문자열을 순차적으로 읽어 나가면서 구간을 나눠보는 방식으로 접근했다.
첫번째 문자는 x,
x와 같은 문자의 수는 xnum,
x와 다른 문자의 수는 ynum (변수명 고민하다가 그냥 ynum했다…)
xnum과 ynum이 같아지면 문자열을 나누고 다시 탐색하는 방식을 택했다.
class Solution {
public int solution(String s) {
int answer = 0;
int xnum = 0, ynum = 0;
char x = s.charAt(0); // 첫 문자를 x로 설정
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == x) xnum++; // x와 같으면 xnum 증가
else ynum++; // 다르면 ynum 증가
if (xnum == ynum) { // 두 횟수가 같으면 구간을 분리
answer++;
xnum = 0;
ynum = 0;
if (i + 1 < s.length()) x = s.charAt(i + 1); // 다음 문자를 새로운 기준 문자로 설정
}
}
// 끝까지 읽고 남은 부분이 있다면 구간 추가
if (xnum != 0 || ynum != 0) answer++;
return answer;
}
}
마지막 남은 문자열이 있다면 그것도 한 구간으로 쳐야한다는 조건을 제대로 확인하지 못한채 작성했다가 테스트 통과가 안되어서 마지막 if문을 추가했다.
코드가 잘 돌아가긴 하지만 간단한 문제에 비해 뭔가.. 코드가 너무 긴 느낌이 들어서 다른 사람의 풀이를 참고해봤다.
일단 코드를 더 단순화 할 수 있도록… 첫 번째 문자를 기준으로 하는 구간 설정과 초기화를 최소화했다.
class Solution {
public int solution(String s) {
int answer = 0;
int same = 0, different = 0;
char x = '1'; // 초기값으로 임의의 문자 설정
for (char c : s.toCharArray()) {
if (x == '1') { // 새 구간 시작
x = c;
same++;
answer++;
} else if (c == x) {
same++;
} else {
different++;
}
// 두 횟수가 같아지면 구간을 나누고 초기화
if (same == different) {
x = '1'; // 다음 구간을 위해 초기화
same = 0;
different = 0;
}
}
return answer;
}
}