https://www.acmicpc.net/problem/3613
[문제 설명]
- 문자열을 이용한 간단한 구현 문제이며 조건 처리만 잘해주면 되므로 반례만 설명 드리겠습니다
- Cpp: 맨 뒤, 맨 앞 문자가 '_' 이면 에러, '_' 연속 두개면 에러
- Java: 맨 앞 문자가 대문자면 에러
- Cpp와 Java를 혼용하는 경우: 대문자와 '_'가 혼종이면 에러
- 그 외: 소문자만 입력 될 경우 정상, 대문자 연속일 경우 정상
//c++ 형식에 위배
//맨 뒤 문자가 '_' 이면 에러
pang_
Error!
//c++ 형식에 위배
//맨 앞 문자가 '_' 이면 에러
_pang
Error!
//c++ 형식에 위배
//'_' 연속 두개면 에러
pang__seyoung
Error!
//Java 형식에 위배
//맨 앞 문자가 대문자면 에러
Seyoung
Error!
// Java와 Cpp 혼용
//대문자와 '_'가 혼종이면 에러
Seyoung_Park
Error!
// 그 외의 경우
//소문자만 입력 될 경우 정상
seyoung
seyoung
// 그 외의 경우
// 대문자 연속일 경우 정상
seYOUNG
se_y_o_u_n_g
Java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static boolean whatIsLanguage = false; // false: c++, true: java
static boolean allOfLower = true;
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder(br.readLine());
// Java, C++ 형식에 맞지 않을 경우
if(!(is_Cpp(sb) && is_Java(sb) && name_check(sb))){
System.out.println("Error!");
return;
}
// 모든 문자가 소문자일 경우 그대로 return
if(allOfLower){
System.out.println(sb.toString());
return;
}
// true = java, false = Cpp
if(whatIsLanguage) sb = javaToCpp(sb);
else sb = cppToJava(sb);
System.out.println(sb.toString());
}
public static boolean name_check(StringBuilder sb){
int isUpperCase = 0;
int isUnderBar = 0;
for(int i=0; i < sb.length(); i++){
char ch = sb.charAt(i);
if(ch >= 'A' && ch <= 'Z') isUpperCase = 1;
else if(ch == '_') isUnderBar = 1;
}
allOfLower = (isUnderBar == 1 || isUpperCase == 1) ? false : true;
// Java와 Cpp 형식을 혼용 했을때 false return
if((isUnderBar & isUpperCase) == 0 || allOfLower) {
whatIsLanguage = (isUnderBar == 1) ? false : true;
return true;
}else return false;
}
public static boolean is_Cpp(StringBuilder sb){
if(sb.charAt(sb.length()-1) == '_') return false;
else if(sb.charAt(0) == '_') return false;
else if(sb.indexOf("__") >= 0) return false;
return true;
}
public static boolean is_Java(StringBuilder sb){
return (sb.charAt(0) >= 'A'&& sb.charAt(0) <= 'Z') ? false : true;
}
public static StringBuilder javaToCpp(StringBuilder sb){
for(int i=0; i<sb.length(); i++){
char ch = sb.charAt(i);
if(ch >= 'A' && ch <= 'Z'){
sb.replace(i, i+1, String.valueOf(ch).toLowerCase());
sb.insert(i, "_");
}
}
return sb;
}
public static StringBuilder cppToJava(StringBuilder sb){
for(int i=0; i<sb.length(); i++){
if(sb.charAt(i) == '_'){
sb.deleteCharAt(i);
sb.replace(i+1, i+1, String.valueOf(sb.charAt(i)).toUpperCase());
sb.deleteCharAt(i);
}
}
return sb;
}
}
'PS > 백준' 카테고리의 다른 글
백준 가희와 키워드 (22233) - Java (0) | 2022.07.29 |
---|---|
백준 데스 나이트 (16948) - Java (0) | 2022.07.25 |
[백준] 추월 (2002) - Java (0) | 2022.07.08 |
[백준] Cupid (16460) - Java (0) | 2022.07.07 |
[백준] 노드 사이 거리 (1240) - Java, bfs (0) | 2022.07.05 |