[99클럽 3일차] [프로그래머스] Lv.0 문자열 나누기

Dev.Dana·2024년 10월 30일
0

Algorithm

목록 보기
8/25
post-thumbnail

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

문자열 나누기 라고 제목을 보자마자 toCharArray()써야지~ 하는 생각부터 들었다.

문제의 조건은 아래와 같다.

1. 첫 번째 문자를 기준으로 같은 문자와 다른 문자의 개수를 세어가며 왼쪽에서 오른쪽으로 이동합니다.
2. 같은 문자와 다른 문자의 개수가 같아지면, 그때까지 읽은 구간을 하나의 문자열로 분리하고, 다시 다음 구간을 새로 시작합니다.
3. 남은 문자열이 없을 때까지 과정을 반복합니다.

첫번째 시도

일단 처음엔 for루프로 처음 문자(char)를 기준으로 문자열을 순차적으로 읽어 나가면서 구간을 나눠보는 방식으로 접근했다.

첫번째 문자는 x,

x와 같은 문자의 수는 xnum,

x와 다른 문자의 수는 ynum (변수명 고민하다가 그냥 ynum했다…)

xnum과 ynum이 같아지면 문자열을 나누고 다시 탐색하는 방식을 택했다.

class Solution {
    public int solution(String s) {
        int answer = 0;
        int xnum = 0, ynum = 0;
        char x = s.charAt(0); // 첫 문자를 x로 설정
        
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == x) xnum++; // x와 같으면 xnum 증가
            else ynum++; // 다르면 ynum 증가
            
            if (xnum == ynum) { // 두 횟수가 같으면 구간을 분리
                answer++;
                xnum = 0;
                ynum = 0;
                if (i + 1 < s.length()) x = s.charAt(i + 1); // 다음 문자를 새로운 기준 문자로 설정
            }
        }
        
        // 끝까지 읽고 남은 부분이 있다면 구간 추가
        if (xnum != 0 || ynum != 0) answer++;
        
        return answer;
    }
}

마지막 남은 문자열이 있다면 그것도 한 구간으로 쳐야한다는 조건을 제대로 확인하지 못한채 작성했다가 테스트 통과가 안되어서 마지막 if문을 추가했다.

코드가 잘 돌아가긴 하지만 간단한 문제에 비해 뭔가.. 코드가 너무 긴 느낌이 들어서 다른 사람의 풀이를 참고해봤다.

두번째 시도 : 다른 사람의 풀이 참고

일단 코드를 더 단순화 할 수 있도록… 첫 번째 문자를 기준으로 하는 구간 설정과 초기화를 최소화했다.

class Solution {
    public int solution(String s) {
        int answer = 0;
        int same = 0, different = 0;
        char x = '1'; // 초기값으로 임의의 문자 설정

        for (char c : s.toCharArray()) {
            if (x == '1') { // 새 구간 시작
                x = c;
                same++;
                answer++;
            } else if (c == x) {
                same++;
            } else {
                different++;
            }

            // 두 횟수가 같아지면 구간을 나누고 초기화
            if (same == different) {
                x = '1'; // 다음 구간을 위해 초기화
                same = 0;
                different = 0;
            }
        }

        return answer;
    }
}
  • 일단 x를 1로 초기화하여 구간이 시작될 때마다 현재 문자를 x로 지정한다.
  • same = different가 같아질때마다 구간을 나눠서 answer를 증가시키고, 모든 변수들을 초기화한 후 다음 구간을 준비한다.
profile
어제의 나보단 나은 오늘의 내가 되기를

0개의 댓글