[Programmers] 브라이언의 고민

Date:

[Programmers] 브라이언의 고민

Problem URL : 브라이언의 고민

#include <string>
#include <vector>
#include <map>
#define p pair<int, int>
#include <iostream>

using namespace std;

// 전역 변수를 정의할 경우 함수 내에 초기화 코드를 꼭 작성해주세요.
string solution(string sentence) {
    string answer = "";
    string invalid = "invalid";
    int size = sentence.length();
    vector<bool> start;
    vector<bool> end;
    start.resize(size + 1);
    end.resize(size + 1);
    map<char,vector<int>> m;
    vector<int> series;

    int lowerCnt = 0;
    for(int i = 0; i < size; i++) {
        char c = sentence[i];
        if(islower(c)) {
            vector<int> tmp = m[c];
            tmp.push_back(i);
            m[c] = tmp;
            lowerCnt++;
            if(lowerCnt == 2) {
                series.push_back(i);
            }else if(lowerCnt > 2){
                return invalid;
            }
        }else {
            lowerCnt = 0;
        }
    }

    for(auto const &i : series) {
        vector<int> pre = m[sentence[i - 1]];
        vector<int> post = m[sentence[i]];
        if(pre.size() != 2 || post.size() != 2) {
            return invalid;
        }
        int a = pre[0];
        int b = pre[1];
        int c = post[0];
        int d = post[1];
        if((a < c && c < b) || (a < d && d < b) || (c < a && a < d) || (c < b && b < d)) {
            return invalid;
        }
    }

    for(auto const &i:m) {
        vector<int> tmp = i.second;
        int tSize = tmp.size();
        if(tSize != 2) {
            if(tmp[0] == 0 || tmp[tSize - 1] == size - 1) {
                return invalid;
            }
            for(int j = 0; j < tSize - 1; j++) {
                if(tmp[j + 1] - tmp[j] != 2) {
                    return invalid;
                }
            }
            if(start[tmp[0] - 1]|| start[tmp[tSize - 1] + 1]) {
                return invalid;
            }
            start[tmp[0] - 1] = true;
            end[tmp[tSize - 1] + 1] = true;
        }
    }

    map<char,bool> check;
    for(int i = 0; i < size; i++) {
        char c = sentence[i];
        if(islower(c)) {
            vector<int> tmp = m[c];
            if(tmp.size() == 2 && i == tmp[0] && !check[c]) {
                int a = tmp[0] + 1;
                int b = tmp[1] - 1;
                for(int j = a + 1; j < b; j++) {
                    if(start[j]) {
                        return invalid;
                    }
                    vector<int> tmp2 = m[sentence[j]];
                    if(tmp2.size() == 2) {
                        if( b - a == 4 && tmp2[0] == a + 1 && tmp2[1] == b - 1) {
                            check[sentence[j]] = true;
                        }else {
                            return invalid;
                        }
                    }
                }
                start[a] = true;
                end[b] = true;
            }
        }
    }
 

    for(int i = 0; i < size; i++) {
        if(isupper(sentence[i])) {
            if(start[i] && !answer.empty() && answer.substr(answer.size() -1) != " ") {
                answer += " ";
            }
            answer += sentence[i];
            if(end[i])  {
                answer += " ";
            }
        }
    }
    if(answer.substr(answer.size() -1) == " ") {
        answer = answer.substr(0,answer.size() - 1);
    }
    return answer;
}

Comments

AC가 되지 않는다… 열심히 반례 케이스를 찾는 중 ㅠㅠ

댓글