문제링크
https://www.acmicpc.net/problem/3613
풀이방법
해당 문제는 다양한 조건을 전부 고려해야 한다는 부분에서 어려운 문제라고 생각한다. 하나라도 놓치면 해당 문제를 맞출 수 없기 때문에 다음과 같은 조건을 잘 고려해야 한다.
- 맨 뒤 문자가 '_' 이면 (Error!)
- 맨 앞 문자가 '_' 이면 (Error!)
- '_' 연속 두개 존재하면 (Error!)
- 맨 앞 문자가 대문자면 에러 (Error!)
- 대문자와 '_'가 각각 1개 이상 동시에 존재하면 (Error!)
- 그 외에 문제에서 정해진 조건인 영어 알파벳과 밑줄('_')로만 이루어져 있는 경우는 정상이라고 볼 수 있다.
아래 코드의 주석을 참고해서 해당 문제를 이해하자!
코드
#include <bits/stdc++.h>
using namespace std;
char change(char c)
{
if ('A' <= c && c <= 'Z')
{
return c + 32;
}
else
{
return c - 32;
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
string s;
cin >> s;
bool isError = false;
vector<char> v;
if (s[0] == '_' || s[s.size() - 1] == '_' || ('A' <= s[0] && s[0] <= 'Z'))
{
isError = true;
}
/*
맨 뒤 문자가 '_' 이면 (Error!)
맨 앞 문자가 '_' 이면 (Error!)
맨 앞 문자가 대문자면 에러 (Error!)
*/
for (int i = 0; i < s.size() - 1; i++)
{
if (s[i] == '_' && s[i + 1] == '_')
{
isError = true;
}
}
/* '_' 연속 두개 존재하면 (Error!) */
int cntA = 0;
int cntB = 0;
for (int i = 0; i < s.size(); i++)
{
if ('A' <= s[i] && s[i] <= 'Z')
{
cntA++;
}
if (s[i] == '_')
{
cntB++;
}
if (cntA >= 1 && cntB >= 1)
{
isError = true;
}
}
/*대문자와 '_'가 각각 1개 이상 동시에 존재하면(error!)*/
int nxt_pos = s.find('_');
if (nxt_pos != -1 && isError == false) // C++ 형식인 경우
{
for (int i = 0; i < s.size(); i++)
{
if (s[i]!='_')
{
v.push_back(s[i]);
}
else
{
v.push_back(change(s[i + 1]));
i++;
}
}
for (auto c : v)
{
cout << c;
}
}
else if (nxt_pos == -1 && isError == false) // Java 형식인 경우
{
for (int i = 0; i < s.size(); i++)
{
if ('A' <= s[i] && s[i] <= 'Z')
{
v.push_back('_');
v.push_back(change(s[i]));
}
else
{
v.push_back(s[i]);
}
}
for (auto c : v)
{
cout << c;
}
}
else // isError가 True인 경우
{
cout << "Error!" << '\n';
}
}
'CS(Computer Science)지식 > [C++][코딩 테스트] 자료구조 및 알고리즘' 카테고리의 다른 글
[C++] 백준 1969번: DNA (0) | 2024.02.04 |
---|---|
[C++] 백준 2870번: 수학숙제 (0) | 2024.02.04 |
[C++] 백준 9996번: 한국이 그리울 땐 서버에 접속하지 (0) | 2024.02.04 |
[C++] 백준 2941번: 크로아티아 알파벳 (0) | 2024.02.04 |
[C++] 백준 1543번: 문서 검색 (0) | 2024.02.04 |