📌 문제 링크
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
📌 문제 개요
문자열 s가 주어졌을 때, 일정한 규칙에 따라 문자열을 여러 개로 분리하는 문제이다.
먼저 현재 문자열의 첫 글자를 기준 문자 x로 잡는다.
왼쪽부터 문자를 확인하면서 x와 같은 문자의 개수와 x와 다른 문자의 개수를 각각 센다.
두 개수가 처음으로 같아지는 순간 문자열을 분리한다.
남은 문자열에 대해서도 같은 과정을 반복하고, 최종적으로 분리된 문자열의 개수를 반환한다.
📌 접근 방법
문자열을 실제로 자르지 않고, 기준 문자와 카운트 변수만 사용해서 처리한다.
현재 기준 문자를 c에 저장한다.
char c = s.charAt(0);
기준 문자와 같은 문자는 same, 다른 문자는 diff에 카운트한다.
if (c == s.charAt(i)) {
same++;
} else {
diff++;
}
두 개수가 같아지면 문자열 하나를 분리한 것이므로 answer를 증가시킨다.
if (same == diff) {
answer++;
}
분리 후에는 다음 문자가 새로운 문자열의 첫 글자가 되므로, 다음 문자가 존재할 때만 기준 문자를 변경한다.
if (i + 1 < s.length()) {
c = s.charAt(i + 1);
}
📌 핵심 아이디어
1. 기준 문자는 현재 남은 문자열의 첫 글자
처음에는 문자열의 첫 글자를 기준 문자로 사용한다.
char c = s.charAt(0);
예를 들어 "banana"의 경우 처음 기준 문자는 b이다.
banana
^
c = b
b와 같은 문자의 개수, b와 다른 문자의 개수를 세다가 두 개수가 같아지면 분리한다.
ba | nana
이후 남은 문자열 "nana"의 첫 글자인 n이 새로운 기준 문자가 된다.
2. same과 diff가 같아지면 분리
기준 문자와 같으면 same, 다르면 diff를 증가시킨다.
if (c == s.charAt(i)) {
same++;
} else {
diff++;
}
그리고 두 값이 같아지는 순간 문자열 하나가 완성된다.
if (same == diff) {
answer++;
same = 0;
diff = 0;
}
예를 들어 "banana"는 다음과 같이 분리된다.
ba
na
na
따라서 결과는 3이다.
3. 마지막에 남은 문자열 처리
문자열을 끝까지 읽었는데 same과 diff가 같아지지 않은 경우도 하나의 문자열로 분리해야 한다.
따라서 반복문이 끝난 뒤 남은 카운트가 있는지 확인한다.
if (diff != 0 || same != 0) {
answer++;
}
예를 들어 "a"처럼 한 글자만 있는 경우에도 하나의 문자열로 세어야 한다.
📌 전체 코드
package level1;
public class No53 {
class Solution {
public int solution(String s) {
char c = s.charAt(0);
int same = 0;
int diff = 0;
int answer = 0;
for(int i = 0; i < s.length(); i++){
if (c == s.charAt(i)){
same++;
} else {
diff++;
}
if(same == diff){
answer++;
if(i + 1 < s.length()){
c = s.charAt(i + 1);
}
same = 0;
diff = 0;
}
}
if(diff != 0 || same != 0){
answer++;
}
return answer;
}
}
}
📄 정리
- 기준 문자는 현재 남은 문자열의 첫 글자이다.
- 기준 문자와 같은 문자는
same, 다른 문자는diff로 카운트한다. same == diff가 되는 순간 문자열 하나를 분리한다.- 마지막에 남은 문자열이 있으면 결과 개수에 포함해야 한다.
- 문자열을 직접 자르지 않고 카운트만으로 해결할 수 있는 구현 문제이다.
'코테(Solved.ac + Programmers)' 카테고리의 다른 글
| 프로그래머스 옹알이 JAVA 풀이(문자열, 구현) (0) | 2026.06.10 |
|---|---|
| 프로그래머스 시험장 나누기 JAVA 풀이 (이분 탐색, DFS, 트리) (0) | 2026.06.10 |
| 프로그래머스 비밀지도 JAVA 풀이 (비트연산, 문자열 변환) (0) | 2026.06.09 |
| 프로그래머스 모의고사 JAVA 풀이 (완전탐색) (0) | 2026.06.06 |
| 프로그래머스 명예의 전당 (1) JAVA 풀이 (우선순위 큐, PriorityQueue) (0) | 2026.06.05 |