본문 바로가기

Algorithm/String

(C++) - LeetCode (easy) 1417. Reformat The String

반응형

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);
    }
};

*더 나은 내용을 위한 지적, 조언은 언제나 환영합니다.