문제
변수 이름이 주어질 때, Java 스타일(camelCase)이면 C++ 스타일(snake_case)로, C++ 스타일이면 Java 스타일로 변환하라. 어떤 스타일에도 해당하지 않으면 "Error!"를 출력한다.
입력
변수 이름이 한 줄로 주어진다 (영문 소문자, 대문자, 밑줄로만 구성).
출력
변환된 변수 이름 또는 "Error!"를 출력한다.
예제
| 입력 | 출력 |
|---|---|
longAndVariableName | long_and_variable_name |
long_and_variable_name | longAndVariableName |
_ | Error! |
풀이
입력 문자열을 분석하여 Java 스타일인지 C++ 스타일인지 판별한 후, 반대 스타일로 변환한다.
- 첫 글자가 소문자가 아니면 에러로 처리한다
- flag 변수로 스타일을 추적한다: 1=Java(대문자 포함), 2=C++(밑줄 포함), 3=둘 다 아님
- 밑줄 연속, 밑줄로 끝남, 대문자와 밑줄 혼재 시 에러로 처리한다
- Java 스타일이면 대문자 앞에 밑줄을 삽입하고 소문자로 변환한다
- C++ 스타일이면 밑줄을 제거하고 다음 문자를 대문자로 변환한다
핵심 아이디어: 유효성 검증을 먼저 수행하고, 스타일에 따라 문자 단위로 변환 규칙을 적용한다.
코드
package day699;
import java.io.*;
public class Day657BOJ3613JAVAvsC {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
char[] c_arr = br.readLine().toCharArray();
int flag = 3;
if (c_arr[0] < 97 || c_arr[0] > 122) {
flag = 0;
} else {
for (int i = 1; i < c_arr.length; i++) {
char c = c_arr[i];
if (c == 95) {
if (flag == 1) {
flag = 0;
break;
} else {
if (i == c_arr.length - 1) {
flag = 0;
break;
} else if (c_arr[i + 1] == '_') {
flag = 0;
break;
} else {
flag = 2;
}
}
} else if (c >= 65 && c <= 90) {
if (flag == 2) {
flag = 0;
break;
} else {
flag = 1;
}
}
}
}
if (flag == 0) {
System.out.println("Error!");
} else if (flag == 1) {
convertToC(c_arr);
} else if (flag == 2) {
convertToJava(c_arr);
} else {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < c_arr.length; i++) {
sb.append(c_arr[i]);
}
System.out.println(sb.toString());
}
return;
}
private static void convertToJava(char[] c_arr) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < c_arr.length; i++) {
char c = c_arr[i];
if (c == 95) {
i++;
sb.append((char) (c_arr[i] - 32));
} else {
sb.append(c);
}
}
System.out.println(sb.toString());
return;
}
private static void convertToC(char[] c_arr) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < c_arr.length; i++) {
char c = c_arr[i];
if (c >= 65 && c <= 90) {
sb.append('_');
sb.append((char) (c + 32));
} else {
sb.append(c);
}
}
System.out.println(sb.toString());
return;
}
}복잡도
- 시간: O(N)
- 공간: O(N)