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
'전공공부 > 코딩테스트' 카테고리의 다른 글
(c++) 프로그래머스 "예상 대진표" (0) | 2022.04.10 |
---|---|
(c++) 프로그래머스 "리틀 프렌즈" (0) | 2022.03.28 |
(c++) 프로그래머스 "튜플" (0) | 2022.03.15 |
(c++) 프로그래머스 "3진법 뒤집기" (0) | 2022.03.15 |
(c++) 프로그래머스 "수식 최대화" (0) | 2022.03.15 |