728x90
https://www.acmicpc.net/problem/3613
예외 사항에 대해서
여러가지 생각해야 되는게 많은 문제였다.
- 첫글자나 마지막 글자에 '_' 나 대문자가 오는가
- '_' 다음에 대문자가 오는가
- '_' 가 연속으로 나오는가
- c++ 이라 처리 했는데 대문자가 나오거나
- java 라 처리 했는데 '_' 가 나오거나
혼자서 문제풀때는 사실
이 모든 예외사항에 대한 부분들을 전부 생각해내지 못했다.
아래의 블로그를 보고나서 다른 예외사항들을 알 수가 있었다.
프로그래밍은 잘하는 사람들이 참 많은 것 같다
이 일을 앞으로 얼마나 할 수 있을지..
https://jaimemin.tistory.com/931
- c++
#include <iostream>
#include <string>
using namespace std;
int main()
{
cin.tie(nullptr);
ios_base::sync_with_stdio(false);
string str;
cin >> str;
bool isCpp = false, isJava = false, isError = false;
string result;
for (int i = 0; i < str.length(); i++)
{
// java
if (isupper(str[i]))
{ // 대문자 이면서
if (!i || isCpp)
{ // 첫글자이거나 cpp 언어가 아닌 경우
isError = true;
break;
}
// 들어온 문자가 java 언어이므로 이를 cpp 로 바꾸기 위해서
// '_' 를 추가해주고, str[i] - 'A' + 'a' 는 아스키 코드 연산에 의해서 소문자로 바꾸겠다는 의미다.
result += '_';
result += str[i] - 'A' + 'a';
isJava = true; // 위 과정을 다 거치면 비로소 java 가 되므로 true 로 바꿈
}
// cpp
else if (str[i] == '_')
{
// '_' 가 들어간 경우
if (!i || isJava || i == str.length() - 1 || str[i + 1] == '_' || isupper(str[i + 1]))
{ // 첫글자 이거나, 자바이거나, 끝 - 1 이거나(i + 1 번째에 대한 연산 필요), 다음글자에 _가 있거나 (연속된 '_' 가 오는 경우), 다음 문자가 대문자('_' 다음에 대문자가 온다는 뜻) 이거나 하면 오류다
isError = true;
break;
}
// 소문자로 바꿔서 삽입
result += str[i + 1] - 'a' + 'A';
i++;
isCpp = true; // 위 과정을 다 거치면 비로소 cpp 가 되므로 true 로 변경
}
else
{
// 대문자나 '_' 둘다 아닌 경우 (소문자 일때) 는 그냥 삽입
result += str[i];
}
}
if (isError)
cout << "Error!\n";
else
cout << result << '\n';
return 0;
}
|
cs |
아직 많은 문자열 문제를 풀어본 것은 아니지만,
내가 생각하기에 문자열 문제를 풀때는
1. 본래 있는 문자열 알고리즘을 사용하는 문제인가 (KMP, Rabin-Karp, Suffix Array, LCP 등)
2. 아스키 코드를 활용해서 문자열 처리가 가능한가
3. 예외처리를 빠짐없이 할 수 있는가
이 세가지를 어느정도 할 수 있어야 할 것 같다
문자열 알고리즘은 코테에 많이 나오기도 하지만
개인적으로 가장 어려운것 같다
728x90
'PS' 카테고리의 다른 글
BOJ 1002 - 터렛 (0) | 2020.08.07 |
---|---|
BOJ 1759 - 암호 만들기 (0) | 2020.08.05 |
BOJ 1919 - 애너그램 만들기 (0) | 2020.08.02 |
BOJ 1152 - 단어의 갯수 (0) | 2020.08.01 |
BOJ 1753 - 최단 경로 (0) | 2020.07.31 |