728x90
오랜만에 알고리즘 포스팅이다.
생각보다 여러 케이스들을 생각하면서 일일이 반례를 찾아주어야 하는 문제라 꽤나 까다로웠던 것 같다.
1. 문제 해결 방법 구상
1. 일단 어떻게 입력이 들어올지 모른다. Java 형식으로 들어올 수도, C++ 형식으로 들어올 수도, 이도저도 아닌 형식으로 들어올 수도 있다.
2. 이도저도 아닌 케이스를 찾아내는 것이 관건이다.
- 일일이 다 찾아서 if문으로 걸러내야한다.
(1) 첫번째 글자가 _나 대문자로 시작하는 경우 (ex. _asd, Asd)
(2) 마지막 글자가 _로 끝나는 경우 (ex. asd_)
(3) C++의 경우 _바로 뒤에 대문자가 오는 경우 (ex. asd_Asd)
(4) (3)의 경우랑 비슷하긴 하나 _바로 뒤가 아니라 중간 글자가 대문자인 경우 (ex. asd_aSd)
(5) 첫번째 글자가 대문자인 경우 (ex. Asd)
3. Java를 C++로, C++를 Java로는 어떻게 바꿀 것인지도 고민주제이다.
(1) Java to CPP : 대문자 기준으로 끊음
(2) CPP to Java : _ 기준으로 끊음
2. 해결 방법 구상에 따라 코드 구현
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <cctype>
using namespace std;
bool isCpp(string str) {
for(auto e : str) {
if(e == '_') return true;
}
return false;
}
int main() {
bool first = true;
string str, buf, ans;
vector<string> words;
cin >> str;
// 첫 번째 글자가 _나 대문자로 시작하는 경우
// _asd, Asd
if(!islower(str[0])) {
cout << "Error!";
return 0;
}
// 마지막 글자가 _로 끝나는 경우
// asd_
if (str[str.size()-1]=='_') {
cout << "Error!";
return 0;
}
if(isCpp(str)) {
istringstream ss(str);
while (getline(ss, buf, '_')){
words.push_back(buf);
}
for(auto w : words) {
if (islower(w[0])) {
if (first) {
first = false;
}
else {
w[0] = toupper(w[0]);
}
ans += w;
}
// c++인데 _뒤에 바로 첫 글자가 소문자가 아닌 경우
else {
cout << "Error!";
return 0;
}
for (int i = 1; i < w.size(); i++) {
if (isupper(w[i])) {
// 두 번째 이상 글자가 소문자가 아닌 경우
cout << "Error!";
return 0;
}
}
}
}
else {
for(auto e : str) {
if (isupper(e)) {
ans += buf;
ans += '_';
buf.clear();
buf += tolower(e);
}
else {
buf += e;
}
}
ans += buf;
}
cout << ans;
return 0;
}
3. 느낀 점
DP나 그래프 문제와는 달리, 이 문제처럼 까다로운 조건들을 다 생각해내야 하는 문제가 당황스러운 것 같기도하다.
이런 edge 케이스들을 잘 찾아내는 것 또한 실력이다.
더 성실하게 문제를 풀어나가도록 하자.
/ /문제제기 및 피드백 언제든지 감사히 받겠습니다.
728x90
'Computer Science > Algorithm' 카테고리의 다른 글
(C++) 백준 1012번 [유기농 배추] (0) | 2023.01.03 |
---|---|
(C++) 백준 1260번 [DFS와 BFS] (0) | 2022.12.30 |
(C++) 백준 1915번 [가장 큰 정사각형] (0) | 2021.03.10 |
(C++) 백준 2468번 [안전 영역] (0) | 2021.03.10 |
(C++) 백준 1149번 [RGB거리] (0) | 2021.03.07 |