티스토리 뷰
예외 처리가 빡센 문제였다.
문제
Java 예찬론자 김동규와 C++ 옹호가 김동혁은 서로 어떤 프로그래밍 언어가 최고인지 몇 시간동안 토론을 하곤 했다. 동규는 Java가 명확하고 에러가 적은 프로그램을 만든다고 주장했고, 동혁이는 Java는 프로그램이 느리고, 긴 소스 코드를 갖는 점과 제네릭 배열의 인스턴스화의 무능력을 비웃었다.
또, 김동규와 김동혁은 변수 이름을 짓는 방식도 서로 달랐다. Java에서는 변수의 이름이 여러 단어로 이루어져있을 때, 다음과 같은 방법으로 변수명을 짓는다.
첫 단어는 소문자로 쓰고, 다음 단어부터는 첫 문자만 대문자로 쓴다. 또, 모든 단어는 붙여쓴다. 따라서 Java의 변수명은 javaIdentifier, longAndMnemonicIdentifier, name, bAEKJOON과 같은 형태이다.
반면에 C++에서는 변수명에 소문자만 사용한다. 단어와 단어를 구분하기 위해서 밑줄('_')을 이용한다. C++ 변수명은 c_identifier, long_and_mnemonic_identifier, name, b_a_e_k_j_o_o_n과 같은 형태이다.
이 둘의 싸움을 부질없다고 느낀 재원이는 C++형식의 변수명을 Java형식의 변수명으로, 또는 그 반대로 바꿔주는 프로그램을 만들려고 한다. 각 언어의 변수명 형식의 위의 설명을 따라야 한다.
재원이의 프로그램은 가장 먼저 변수명을 입력으로 받은 뒤, 이 변수명이 어떤 언어 형식인지를 알아내야 한다. 그 다음, C++형식이라면 Java형식으로, Java형식이라면 C++형식으로 바꾸면 된다. 만약 C++형식과 Java형식 둘 다 아니라면, 에러를 발생시킨다. 변수명을 변환할 때, 단어의 순서는 유지되어야 한다.
재원이는 프로그램을 만들려고 했으나, 너무 귀찮은 나머지 이를 문제를 읽는 사람의 몫으로 맡겨놨다.
재원이가 만들려고 한 프로그램을 대신 만들어보자.
입력
첫째 줄에 변수명이 주어진다. 영어 알파벳과 밑줄('_')로만 이루어져 있고, 길이는 100을 넘지 않는다.
출력
입력으로 주어진 변수명이 Java형식이면, C++형식으로 출력하고, C++형식이라면 Java형식으로 출력한다. 둘 다 아니라면 "Error!"를 출력한다.
예외 케이스
1. AA -> _a_a (x)
2. AB_a -> java이다가 갑자기 cpp
3. _a -> cpp 예외 케이스
4. a_ -> cpp 예외 케이스
5. a__a -> cpp 예외 케이스
6. name -> name
7. a_b_C -> cpp이다가 갑자기 java
이런 예외 케이스들을 모두 처리해줘야 정답처리 된다.
#include <iostream>
#include <string>
using namespace std;
int main() {
while (true) {
string s;
cin >> s;
int size = s.length();
string newStr;
bool iscpp = false;
bool isjava = false;
if (s[0] == '_' || s[size - 1] == '_') { // case : 시작과 끝에 _
cout << "Error!" << endl; return 0;
}
for (int i = 0; i < size; i++) {
if (s[i] == '_') { // case : c++
iscpp = true; if ( (isjava && iscpp) || s[i + 1] == '_') { cout << "Error!" << endl; return 0; } // case : 연속 언더바 __, case : cpp이다가 java
}
else if (s[i] >= 'A' && s[i] <= 'Z') { // case : java
isjava = true; if ( (isjava && iscpp) || i == 0) { cout << "Error!" << endl; return 0; } // case : java이다가 cpp, 맨앞글자가 대문자
string c;
c += s[i] + 32;
if (i != 0) c = "_" + c; // case : AA -> _a_a, 맨앞에 언더바
newStr = newStr + c;
}
else { // 소문자인 경우
if (i >= 1 && s[i - 1] == '_') s[i] = s[i] - 32;
newStr += s[i] ;
}
}
cout << newStr << endl;
}
return 0;
}
'알고리즘' 카테고리의 다른 글
longest-substring-without-repeating-characters (0) | 2020.05.30 |
---|---|
[leetcode] 추천 75문제 중 1번. twoSum (0) | 2019.12.12 |
1790번 수 이어 쓰기 2 (0) | 2018.12.02 |
15685번 드래곤 커브 (0) | 2018.11.08 |
14500번 테트로미노 (0) | 2018.11.08 |
- Total
- Today
- Yesterday
- javascript
- reflow
- design system
- hydrate
- reactdom
- computed
- state
- return type
- react
- reducer
- type alias
- es6
- typescript
- rendering scope
- async
- props
- Next.js
- useEffect
- atomic design
- storybook
- Polyfill
- webpack
- server side rendering
- useRef
- Babel
- Action
- await
- mobx
- promise
- react hooks
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |