반응형
https://leetcode.com/problems/reformat-the-string/description/
문자열을 다뤄본 문제였습니다.
📕 풀이방법
📔 입력 및 초기화
숫자와 alphabat 문자의 개수 및 내용을 각각 세기 위해 stack digits, alphas를 선언해 저장해줍니다.
📔 풀이과정
1. 비둘기집의 원리에 의해 digit과 alphabat이 번갈아 나오려면 문자 개수의 차이가 1이하여야 가능합니다. 2개 이상 차이 난다면 어떤 방법으로도 연속적으로 두 문자가 나오게 되므로 번갈아 배치할 수 없습니다. 따라서 이 경우에는 ""를 반환합니다.2. 문자의 차이가 1개라면 더 많은 문자가 양 끝에 배치해야 성공합니다. 따라서 digits와 alphas 중 더 많은 문자를 보유한 stack을 reformedString함수의 첫 번째 인자로 전달합니다.3. reformedString함수는 두 stack에서 원소를 하나씩 pop해 번갈아 문자열을 이어 반환해줍니다. 더 많은 문자 개수를 보유한 stack이 첫 번째 인자로 오므로 번갈아 배치 후 남은 원소를 첫 번째 인자에서 top을 문자 뒤에 이어준뒤 pop해줍니다.
📔 정답 출력 | 반환
reformedString 함수의 결과를 반환합니다.
📕 Code
📔 C++
class Solution {
public:
string reformedString(stack<char> a, stack<char> b){
string s;
while(a.size() && b.size()) {
s += a.top();
a.pop();
s += b.top();
b.pop();
}
if(a.size()) {
s += a.top();
a.pop();
}
return s;
}
string reformat(string s) {
stack <char> digits, alphas;
for(auto c : s) {
if('a' <= c && c <= 'z') alphas.push(c);
else digits.push(c);
}
if(abs((int)digits.size() - (int)alphas.size()) >= 2) return "";
if(digits.size() >= alphas.size()) {
return reformedString(digits, alphas);
}
return reformedString(alphas, digits);
}
};
*더 나은 내용을 위한 지적, 조언은 언제나 환영합니다.