[OLD] 기존 글 저장

프로그래머스 연습문제 풀이 : 문자열 나누기 (JAVA)

한민기 2023. 1. 22. 18:58
반응형

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/140108

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

❓  문 제

문자열 s가 입력되었을 때 다음 규칙을 따라서 이 문자열을 여러 문자열로 분해하려고 합니다.

  • 먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다.
  • 이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 x가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다.
  • s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복합니다. 남은 부분이 없다면 종료합니다.
  • 만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다.

문자열 s가 매개변수로 주어질 때, 위 과정과 같이 문자열들로 분해하고, 분해한 문자열의 개수를 return 하는 함수 solution을 완성하세요.

✏️  제 한  사 항

  • 1 ≤ s의 길이 ≤ 10,000
  • s는 영어 소문자로만 이루어져 있습니다.

💻  입 출 력  예

❗️ 입 출 력  예  설 명

입출력 예 #1
s="banana"인 경우 ba - na - na와 같이 분해됩니다.

 

입출력 예 #2
s="abracadabra"인 경우 ab - ra - ca - da - br - a와 같이 분해됩니다.

 

입출력 예 #3
s="aaabbaccccabba"인 경우 aaabbacc - ccab - ba와 같이 분해됩니다.


💡 문 제  풀 이

문제에서 한 가지의 요점을 파악할 수 있다.

  • 처음으로 두 횟수가 같아지는 순간을 멈추고 문자열을 분리한다.
    • 이때 첫 번째 문자열이 x라고 할때 x의 갯수와 x가 아닌 문자열의 갯수를 파악한다.

위 한가지 요점을 문제를 해결할 수 있다. 

 

위 문제의 유형은 "구현" 문제인 것 같다.

 

1. 첫 번째 문자 추출 

문자열에서 char 형을 추출하는 것이기 때문에 charAt 메소드를 사용하여 단어를 추출한다.

// 첫번째 문자 추출
char c = s.charAt(0);

 

2.  문제의 요건 중 하나인 x의 갯수와 x가 아닌 문자의 갯수를 저장할 변수 2개를 지정한다.

// idx : 처음나온 문자의 갯수
// jdx : 처음나온 문자가 아닌 문자의 갯수
int idx = 0, jdx = 0;

 

3. 첫번째 요건을 풀이에 적용한다.

위에서 선언한 두개의 변수가 같을 때 구간 분리하며 answer를 더해준 후 새로운 문자를 추출하여 문자열을 분리시간 효과를 얻는다. 

// 문제의 첫번째 요건 : 처음나온 문자의 갯수와 처음나온 문자가 아닌 문자의 갯수가 동일할 때
// 문자열을 분리하기 때문에 answer 를 증가 시켜준 후 c 즉, 첫번째 문자를 저장한다.
if (idx == jdx) {
	answer++;
	c = s.charAt(i);
}

 

4. 추출한 문자와 현재 문자가 같으면 idx를 다르면 jdx를 증가시킨다.

// 추출한 첫번째 문자와 동일할 경우 idx 를 증가
// 첫번째 문자가 아닐 경우 jdx 증가
if (s.charAt(i) == c) idx++;
else jdx++;

 

여기까지의 행동을 문자열의 길이만큼 반복하면 몇개의 구간이 생기는지 answer 변수에 저장이 된다.

 

⌨️ 풀 이  코 드

public class 문자열나누기 {
    public static void main(String[] args) {
        Solution_문자열나누기 s = new Solution_문자열나누기();

        //3
        System.out.println(s.solution("banana"));

        //6
        System.out.println(s.solution("abracadabra"));

        //3
        System.out.println(s.solution("aaabbaccccabba"));
    }
}

class Solution_문자열나누기 {
    public int solution(String s) {
        int answer = 0;

        // 첫번째 문자 추출
        char c = s.charAt(0);

        // idx : 처음나온 문자의 갯수
        // jdx : 처음나온 문자가 아닌 문자의 갯수
        int idx = 0, jdx = 0;

        for (int i = 0; i < s.length(); i++) {

            // 문제의 첫번째 요건 : 처음나온 문자의 갯수와 처음나온 문자가 아닌 문자의 갯수가 동일할 때
            // 문자열을 분리하기 때문에 answer 를 증가 시켜준 후 c 즉, 첫번째 문자를 저장한다.
            if (idx == jdx) {
                answer++;
                c = s.charAt(i);
            }

            // 추출한 첫번째 문자와 동일할 경우 idx 를 증가
            // 첫번째 문자가 아닐 경우 jdx 증가
            if (s.charAt(i) == c) idx++;
            else jdx++;
        }

        return answer;
    }
}

 

✅ 비 고

 

 

반응형