문제 링크 : 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;
}
}
✅ 비 고
'[OLD] 기존 글 저장' 카테고리의 다른 글
| 프로그래머스 연습문제 풀이 : 미로탈출 명령어 (JAVA) (0) | 2023.02.05 |
|---|---|
| 프로그래머스 연습문제 풀이 : 인사고과 (JAVA) (1) | 2023.01.24 |
| 프로그래머스 연습문제 풀이 : 양과 늑대 (JAVA) (2) | 2023.01.17 |
| 프로그래머스 연습문제 풀이 : 파괴되지 않은 건물 (JAVA) (3) | 2023.01.16 |
| [Java Algorithm] 누적 합(prefix sum)과 2차원 누적 합 (0) | 2023.01.09 |