본문 바로가기
Algorithm/Programmers

[Programmers] Lv.1 | 문자열 나누기 | Java

by unknownomad 2025. 12. 10.

문제

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;
    }
}

댓글