※주의※
저의 풀이가 정답은 아닙니다.
다른 코드가 더 효율적이거나 좋을 수 있습니다.
언제나 다른 사람의 코드는 참고만 하시기 바랍니다.
[문제 풀이 사이트]
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
[문제 설명]
문자열 s가 입력되었을 때 다음 규칙을 따라서 이 문자열을 여러 문자열로 분해하려고 합니다.
- 먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다.
- 이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 x가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다.
- s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복합니다. 남은 부분이 없다면 종료합니다.
- 만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다.
문자열 s가 매개변수로 주어질 때, 위 과정과 같이 문자열들로 분해하고, 분해한 문자열의 개수를 return 하는 함수 solution을 완성하세요.
[제한 사항]
- 1 ≤ s의 길이 ≤ 10,000
- s는 영어 소문자로만 이루어져 있습니다.
[입출력 예]
s | result |
"banana" | 3 |
"abracadabra" | 6 |
"aaabbaccccabba" | 3 |
[입출력 예 설명]
입출력 예 #1
s="banana"인 경우 ba - na - na와 같이 분해됩니다.
입출력 예 #2
s="abracadabra"인 경우 ab - ra - ca - da - br - a와 같이 분해됩니다.
입출력 예 #3
s="aaabbaccccabba"인 경우 aaabbacc - ccab - ba와 같이 분해됩니다.
[문제 풀이]
문제에서 주어진 방법대로 풀면된다.
1. 먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다.
➜ 우선 첫글자인지 판단하는 방법은 boolean 변수(isinit) 값이 true이면 첫 글자이고, false이면 첫글자가 아니다.
➜ 첫 글자인 경우 첫글자를 char 변수(first)에 저장하고 첫 글자와 같은 문자의 개수를 카운트할 변수(samecnt)를 1 증가 시킨다.
그리고 지금까지 읽은 문자열 변수(plus)에 읽은 문자를 추가해준다. 그리고 다음에 읽을 문자가 첫 글자가 아니기 때문에 boolean 변수(isinit)을 false로 변경해준다.
2. 이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 x가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다.
➜ 문자열을 읽어나가면서 첫글자와 같은 문자인 경우 samecnt 변수를 1 증가 시키고 지금 까지 읽은 문자열 변수(plus)에 읽은 문자를 추가해준다.
➜ 문자열을 읽어나가면서 첫글자와 다른 문자인 경우 differcnt 변수를 1 증가 시키고 지금 까지 읽은 문자열 변수(plus)에 읽은 문자를 추가해준다.
그리고 첫 글자와 같은 문자의 개수를 카운트 하는 변수(samecnt)와 첫 글자와 다른 문자의 개수를 카운트 하는 변수(differcnt) 비교한다.
만약 첫 글자와 같은 문자의 개수를 카운트 하는 변수(samecnt)와 첫 글자와 다른 문자의 개수를 카운트 하는 변수(differcnt) 변수를 비교했을 때 같다면
➜ string 배열(d)에 지금까지 읽은 문자열 변수(plus)를 추가하고 samecnt, differcnt, plus 변수를 초기화한다.
그리고 다음에 읽을 문자는 첫 글자이기 때문에 첫 글자인지 판단하는 boolean 변수(isinit)를 true로 변경해준다.
➜ 만약 첫 글자와 같은 문자의 개수를 카운트 하는 변수(samecnt)와 첫 글자와 다른 문자의 개수를 카운트 하는 변수(differcnt) 변수를 비교했을 때 다르다면 다시 위 과정을 수행한다.
3. 만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다.
➜ 같은 문자의 개수를 카운트 하는 변수(samecnt)와 다른 문자의 개수를 카운트 하는 변수(differcnt)가 다르고
현재 읽고 있는 위치(인덱스)가 문자열의 끝일 때 string 배열(d)에 지금까지 읽은 문자열 변수(plus)를 추가한다.
4. 분해한 문자열의 개수는 string 배열 변수(d)에 저장되어 있기 때문에 string 배열 변수 사이즈(크기)를 리턴해주면 된다.
[최종 코드]
[GitHub]
GitHub - SmallPeanutPark/Programmers: Study Programmers for Coding Test
Study Programmers for Coding Test. Contribute to SmallPeanutPark/Programmers development by creating an account on GitHub.
github.com
#include <string>
#include <vector>
#include <iostream>
using namespace std;
vector<string> d;
void divideStr(string str) {
string plus = ""; // 읽은 문자열
char first = '0'; // 첫글자
int samecnt = 0; // 같은 글자 개수
int differcnt = 0; // 다른 글자 개수
int len = str.length();
bool isinit = true;
for(int i = 0; i < len; ++i) {
if(isinit == true) {
// 초기값 읽을 때
isinit = false;
first = str[i];
plus += str[i];
samecnt += 1;
} else {
// 초기값 이후
if(first == str[i]) {
samecnt += 1;
plus += str[i];
} else {
// first != str[i] 서로 다른 글자일 때
differcnt += 1;
plus += str[i];
// 같은 글자의 개수와 다른 글자의 개수가 동일할 때 정지
if(samecnt == differcnt) {
// 초기화
samecnt = 0;
differcnt = 0;
d.emplace_back(plus);
plus.clear();
isinit = true;
}
}
}
if(samecnt != differcnt) {
// 두 횟수가 다른 상태
// 더이상 읽을 글자가 없다 -> 문자열의 끝을 의미하는 것으로 보임
if(i == len - 1) {
d.emplace_back(plus);
}
}
}
}
int solution(string s) {
divideStr(s);
int answer = d.size();
return answer;
}
'PS > Programmers' 카테고리의 다른 글
[Programmers Level2] 오픈채팅방(C++) (1) | 2022.12.11 |
---|---|
[Programmers Level2] 방문길이(C++) (2) | 2022.12.10 |
[Programmers Level1] 성격 유형 검사하기(C++) (2) | 2022.12.03 |
[Programmers Level1] 명예의 전당(C++) (2) | 2022.12.02 |
[Programmers Level1] 옹알이(2)(C++) (0) | 2022.12.01 |
댓글