본문 바로가기
전공공부/코딩테스트

(c++) [미완성] "브라이언의 고민"

by 시아나 2022. 3. 28.

https://programmers.co.kr/learn/courses/30/lessons/1830#

 

코딩테스트 연습 - 브라이언의 고민

 

programmers.co.kr


나의코드

#include <string>
#include <vector>
#include <unordered_map>

using namespace std;

vector<string> strs; //각 단어 저장
vector<pair<bool, bool>> isRulsDone; //사용한 규칙 저장
vector<string> strDone; //정상적인 단어 저장
unordered_map<char, int> mSpacial; //사용한 특수문자 저장
int num;

void initialize() { //초기화
    strs = vector<string>(0);
    isRulsDone = vector<pair<bool, bool>>(0);
    mSpacial = unordered_map<char, int>(0);
    num = 0;
}

bool checkRull() {
    for (int i = 0; i < strs.size(); i++) {
        char rule; string tmp;
        string str = strs[i];
        int index = str.size() - 1;
        if (str == "") continue; //적용 완료된 문장
        if (str.size() > 1 && str[1] >= 'a' && str[1] <= 'z') { //규칙1
            rule = str[1];
            if (mSpacial[rule] > 0 || isRulsDone[i].first) return true;
            mSpacial[rule]++;
            isRulsDone[i].first = true;
            for (int k = 0; k < str.size(); k++) {
                if (k % 2 == 1) {
                    if (str[k] != rule) { //특수문자 확인
                        if (str[k] == ' ') return true;
                        index = k;
                        break;
                    }
                }
                else {
                    tmp += str[k];
                }
            }
            strs[i] = tmp;
        }
        else if (str[0] >= 'a' && str[0] <= 'z') { //규칙2
            rule = str[0];
            if (mSpacial[rule] > 0 || isRulsDone[i].second) return true;
            mSpacial[rule]++;
            isRulsDone[i].second = true;
            for (int k = 1; k < str.size(); k++) {
                if (str[k] == rule) {
                    index = k + 1;
                    break;
                }
                else {
                    if (str[k] == ' ') return true;
                    tmp += str[k];
                }
            }
            strs[i] = tmp;
        }
        else {
            for (int k = 0; k < str.size(); k++) {
                if (str[k] >= 'a' && str[k] <= 'z')
                    return true;
            }
            strDone[i] = str;
            strs[i].clear();
            num++;
        }
        if (index < str.size() - 1) {
            string input = str.substr(index);
            strs.push_back(input);
            isRulsDone.push_back({ false,false });
        }
    }
    return false;
}

// 전역 변수를 정의할 경우 함수 내에 초기화 코드를 꼭 작성해주세요.
string solution(string sentence) {
    string answer = "";
    initialize();
    strDone = vector<string>(sentence.size());
    strs.push_back(sentence);
    isRulsDone.push_back({ false,false });
    while (num < strs.size()) {
        if (checkRull()) return "invalid";
    }
    answer += strDone[0];
    for (int i = 1; !strDone[i].empty(); i++) {
        answer += " ";
        answer += strDone[i];
    }
    return answer;
}

 

지문에 나온 테스트 케이스는 잘 작동한다.

내일은 반례를 찾아봐야겠다.

https://programmers.co.kr/questions/20530

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr