https://www.acmicpc.net/problem/3613
String parsing문제입니다.
우선 문제부터 요약하면, java와 c++의 naming 규칙에 따라 지어진 변수 이름을 서로 변환 하는 코드를 작성해야 합니다. 이 때, 변수 이름이 두 언어의 변수 명명 조건과 어긋나는 경우엔 Error를 출력해야 합니다.
<Solution>
생각 보다 조건들을 많이 생각해야 해서 까다로운데,
반례 게시글에 있듯이 이 조건들에 주의해서 코딩을 해야 합니다.
//맨 뒤 문자가 '_' 이면 에러
asd_
Error!
//맨 앞 문자가 '_' 이면 에러
_asd
Error!
//'_' 연속 두개면 에러
as__asd
Error!
//맨 앞 문자가 대문자면 에러
Aasd
Error!
//대문자와 '_'가 혼종이면 에러
asdAasd_asd
Error!
//소문자만 입력 될 경우 정상
fadfadfadsf
fadfadfadsf
// 대문자 연속일 경우 정상
asdasdASDASD
asdasd_a_s_d_a_s_d
실제 구현은 아래와 같습니다.
#include <iostream>
#include <string>
using namespace std;
string s;
string new_s;
void getinput(){
cin >> s;
}
int determine_format(){
// check if it is c++ format
int ret_val = 0;
for(int i = 0; i<s.length(); i++){
if(!((s[i]>= 'a' && s[i]<= 'z') || s[i] == '_')){
ret_val = 2;
break;
}
}
if(ret_val == 0){
// if there is connected _
for(int i = 0; i<s.length()-1; i++){
if(s[i] == '_' && s[i+1] == '_'){
ret_val = 2;
break;
}
}
if(ret_val == 0){
if(s.back() == '_' || s.front() == '_'){
ret_val = 2;
}
}
}
if(ret_val == 0) return ret_val;
// check if it is java format
ret_val = 1;
for(int i = 0; i<s.length(); ++i){
if(!((s[i]>='a' && s[i]<= 'z') || s[i]>='A' && s[i] <='Z')){
ret_val = 2;
break;
}
}
if(ret_val == 1){
// check if first letter is capital
if(s.front()>='A' && s.front() <= 'Z'){
ret_val = 2;
}
}
return ret_val;
}
void ctoj(){ // c++ to java
for(int i = 0; i<s.length(); ++i){
if(s[i] == '_'){
i++;
new_s+=s[i]-'a'+'A';
}
else{
new_s+=s[i];
}
}
}
void jtoc(){ // java to c++
for(int i = 0; i<s.length(); ++i){
if(s[i]>='A' && s[i] <='Z'){
new_s+='_';
new_s+=s[i]-'A'+'a';
}
else{
new_s+=s[i];
}
}
}
int main(){
getinput();
// determine which format
int format = determine_format(); //0-> c++ format 1 -> java format 2 -> none of it
// cout << "format is : " << format << endl;
if(format == 1){
jtoc();
}
else if(format == 0){
ctoj();
}
else{
new_s = "Error!";
}
cout << new_s << endl;
}
반응형
'코딩테스트 > C++ 문제풀이' 카테고리의 다른 글
[LeetCode] 3Sum Closest (0) | 2022.12.31 |
---|---|
[백준] N과 M (9) (0) | 2022.12.25 |
[백준] N과 M (12) (0) | 2022.12.10 |
[백준] 마라톤 1 (0) | 2022.12.01 |
[백준] 공주님의 정원 (0) | 2022.12.01 |