프로그래머스 - 문자열 나누기

윤민선·2026년 7월 14일

프로그래머스

목록 보기
44/76

문제 설명

문자열 s를 아래 규칙으로 나눌 때 총 덩어리의 수를 반환하는 문제이다.

  1. 첫 글자를 기준 문자(x)로 정한다
  2. 기준 문자와 같은 글자 수(same), 다른 글자 수(diff)를 센다
  3. same == diff가 되는 순간 하나의 덩어리로 자른다
  4. 남은 문자열에서 다시 1번부터 반복
  5. 문자열 끝까지 잘리지 않은 덩어리가 있으면 +1

접근 방법

s = "banana"
 
1번째 덩어리: x = 'b'
  b → same=1, diff=0
  a → same=1, diff=1  ← same == diff → "ba" 자르기, answer=1
 
2번째 덩어리: x = 'n'
  n → same=1, diff=0
  a → same=1, diff=1  ← same == diff → "na" 자르기, answer=2
 
3번째 덩어리: x = 'n'
  n → same=1, diff=0
  a → same=1, diff=1  ← same == diff → "na" 자르기, answer=3
 
총 덩어리 수 → 3

두 가지 포인트가 있다.

첫 번째, 덩어리가 잘린 직후 다음 글자를 새로운 기준 문자로 설정해야 한다.

if (i + 1 < s.length()) {
    x = s.charAt(i + 1);
}

두 번째, 문자열 끝까지 왔는데 same == diff가 되지 않은 경우 잘리지 않은 덩어리가 남아있다. 이를 마지막에 +1로 처리해야 한다.

if (same > 0) {
    answer++;
}

예를 들어 "xxxxx"처럼 기준 문자만 있으면 same == diff가 절대 되지 않아서 덩어리가 하나도 안 잘린 채 끝난다. 이럴 때 same > 0이면 처리 안 된 덩어리가 있다는 의미이다.

구체적으로 정리한 풀이 흐름:

  1. 첫 글자를 기준 문자 x로 설정
  2. 문자열을 순회하면서 same, diff 증가
  3. same == diff이면 덩어리 수 +1, same/diff 초기화, 다음 기준 문자 설정
  4. 순회 끝난 후 same > 0이면 덩어리 수 +1

최종 코드

class Solution {
    public int solution(String s) {
        int answer = 0;
        int same = 0, diff = 0;
        char x = s.charAt(0);
 
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == x) {
                same++;
            } else {
                diff++;
            }
 
            if (same == diff) {
                answer++;
                same = 0;
                diff = 0;
                if (i + 1 < s.length()) {
                    x = s.charAt(i + 1);
                }
            }
        }
 
        if (same > 0) {
            answer++;
        }
 
        return answer;
    }
}

0개의 댓글