문제/프로그래머스

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

icodesiuuuu 2024. 11. 24. 23:04

문제

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


문제 개요

주어진 문자열 s를 특정 규칙에 따라 여러 부분 문자열로 분해하고, 분해된 문자열의 개수를 반환하는 문제입니다. 분해 규칙은 다음과 같습니다:

  1. 첫 글자를 기준으로 두 종류의 문자(x, x가 아닌 다른 문자)의 등장 횟수를 비교합니다.
  2. 두 종류의 문자 등장 횟수가 같아지는 순간 문자열을 분리합니다.
  3. 분리 후 남은 문자열에 대해 같은 과정을 반복합니다.
  4. 남은 문자열이 없다면 종료합니다.

접근 방법

  1. 초기화 및 설정
    • 첫 글자를 기준으로 문자 x를 설정합니다.
    • x의 개수를 세는 변수 cnt와 x가 아닌 문자의 개수를 세는 변수 diff를 초기화합니다.
    • 결과로 반환할 분리된 문자열의 개수를 저장할 변수 answer를 초기화합니다.
  2. 문자열 순회
    • 문자열을 왼쪽에서 오른쪽으로 순회하며 현재 문자가 x와 같으면 cnt를 증가시키고, 다르면 diff를 증가시킵니다.
    • cnt와 diff가 같아지면 현재까지의 문자열을 하나의 부분 문자열로 분리합니다.
      • 이때, answer를 증가시키고 cnt, diff, x를 초기화하여 다음 부분 문자열 탐색을 시작합니다.
  3. 반복 종료
    • 문자열 순회가 종료되었을 때, 아직 분리되지 않은 문자열이 남아 있다면 이를 하나의 부분 문자열로 간주하여 answer에 1을 더합니다.

코드

class Solution {
    public int solution(String s) {
        int answer = 0;  // 결과 문자열 개수
        int cnt = 1;     // x의 개수
        int diff = 0;    // x가 아닌 다른 문자 개수
        char cur = s.charAt(0); // 현재 기준 문자 x
        
        // 문자열 순회
        for (int i = 1; i < s.length(); i++) {
            // cnt와 diff가 같아지면 문자열 분리
            if (cnt == diff) {
                answer++;
                cnt = 1;
                diff = 0;
                cur = s.charAt(i);
                continue;
            }
            // 문자 일치 여부에 따라 카운트
            if (cur == s.charAt(i)) {
                cnt++;
            } else {
                diff++;
            }
        }
        
        return answer + 1; // 마지막 남은 문자열 포함
    }
}