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

풀이
class Solution {
public int solution(String s) {
// 문자열을 몇 개의 조각으로 나누는지 셀 변수
int answer = 0;
// 첫 글자를 기준 문자 x로 설정
char x = s.charAt(0);
// x가 나온 횟수
int countX = 0;
// x가 아닌 글자가 나온 횟수
int countNotX = 0;
// 문자열을 왼쪽부터 차례대로 하나씩 읽는다
for (int i = 0; i < s.length(); i++) {
// 현재 보고 있는 문자
char c = s.charAt(i);
// 현재 문자 c가 기준 문자 x와 같으면 countX 증가
if (c == x) {
countX++;
}
// x와 다르면 countNotX 증가
else {
countNotX++;
}
// x의 개수와 x가 아닌 개수가 같아지는 순간
// → 하나의 조각이 완성되었음을 의미한다.
if (countX == countNotX) {
answer++; // 조각 하나 추가!
// 다음 조각을 만들기 위해 초기화
// i가 마지막 인덱스가 아니라면
// 다음 글자를 새로운 기준 x로 설정
if (i + 1 < s.length()) {
x = s.charAt(i + 1);
}
// 다시 새 조각을 만들기 위해 개수 초기화
countX = 0;
countNotX = 0;
}
}
/*
* 왜 마지막에 이 조건을 확인하고 answer++ 하는가?
*
* 반복문 안에서는 "countX == countNotX"가 되는 순간에만 조각을 나눈다.
* 하지만 문자열을 끝까지 읽었는데도
* countX와 countNotX가 같아지지 않는 경우가 존재한다.
*
* 예) "a", "aaabb" 같은 경우
* - x가 3번, 나머지가 2번 → 끝까지 가도 균형이 안 맞음
* - 하지만 이 문자들은 전체가 하나의 조각이므로 answer를 1 증가해야 함
*
* 따라서 반복문이 끝난 시점에
* 아직 countX와 countNotX 중 하나라도 0이 아니라면
* (즉 아직 '미완성 조각'이 남아 있다면)
* 마지막 조각을 1개 더 추가해준다.
*/
if (countX != 0 || countNotX != 0) {
answer++;
}
return answer;
}
}
class Solution {
public int solution(String s) {
// 기준 문자(x). '1'은 아직 기준 문자가 없다는 뜻으로 사용
char x = '1';
// 기준 문자 x가 나온 횟수
int countX = 0;
// 기준 문자가 아닌 문자가 나온 횟수
int countNotX = 0;
// 최종적으로 분리된 문자열 조각 개수
int answer = 0;
// 문자열을 문자 배열로 순회
for (char c : s.toCharArray()) {
// 새로운 조각을 시작할 때 (x가 아직 설정되지 않은 상태)
if (x == '1') {
x = c; // 기준 문자를 현재 문자로 설정
countX++; // 기준 문자 등장 1회
answer++; // 새로운 조각이 시작되었으므로 +1
}
// 현재 문자가 기준 문자 x와 같으면
else if (c == x) {
countX++; // 기준 문자 개수 증가
}
// 현재 문자가 기준 문자와 다르면
else {
countNotX++; // 다른 문자 개수 증가
}
// 기준 문자 개수 == 다른 문자 개수 → 조각 하나 완성
if (countX == countNotX) {
// 다음 조각을 시작하기 위해 초기화
x = '1'; // 새로운 조각 시작을 알리는 상태
countX = 0;
countNotX = 0;
}
}
return answer;
}
}'Algorithm > Programmers' 카테고리의 다른 글
| [Programmers] Lv.1 | 가장 가까운 같은 글자 | Java (0) | 2025.12.08 |
|---|---|
| [Programmers] Lv.1 | 크기가 작은 부분 문자열 | Java (0) | 2025.11.25 |
| [Programmers] Lv.1 | 개인정보 수집 유효기간 | Java (0) | 2025.11.24 |
| [Programmers] Lv.1 | 둘만의 암호 | Java (0) | 2025.11.20 |
| [Programmers] Lv.1 | 카드 뭉치 | Java (0) | 2025.11.20 |
댓글