https://www.acmicpc.net/problem/3613
3613번: Java vs C++
Java 예찬론자 김동규와 C++ 옹호가 김동혁은 서로 어떤 프로그래밍 언어가 최고인지 몇 시간동안 토론을 하곤 했다. 동규는 Java가 명확하고 에러가 적은 프로그램을 만든다고 주장했고, 동혁이는
www.acmicpc.net
입력은 주어진 규칙을 따라야 한다.
- 첫 글자는 반드시 소문자여야 한다
- 대문자와 밑줄은 같은 변수명에서 나올 수 없다
- 밑줄은 두 글자 이상 연속해서 나올 수 없다
- 밑줄은 변수명 마지막에 올 수 없다
이상의 규칙을 따르는 한, 변수명은 다음과 같이 변환된다.
- 소문자는 바뀌지 않는다
- 대문자는 밑줄 + 소문자로 바뀐다
- 밑줄 + 소문자는 대문자로 바뀐다
#include <cstdio>
bool is_small(char c) { return c >= 'a' && c <= 'z'; }
bool is_big(char c) { return c >= 'A' && c <= 'Z'; }
bool is_valid(char c) { return is_small(c) || is_big(c) || c == '_'; }
int main() {
// camelCase, snake_case: 입력받은 변수명이 각 형식과 닮은 부분이 있다면 true
bool camelCase = false, snake_case = false;
// c: 변수명을 글자 단위로 입력받을 공간, ans: 변수명을 변환해 저장할 공간
char c, ans[200] = "";
// i: ans에 접근하기 위한 인덱스
int i = 0;
// 변수명의 각 글자에 대해
while (scanf("%c", &c) && is_valid(c) && !(camelCase && snake_case)) {
// 소문자는 양쪽 모두에 포함되므로 ans에 그대로 저장
if (is_small(c)) ans[i++] = c;
// 첫 글자 이외의 부분에 대문자가 들어왔다면
else if (is_big(c) && i) {
// camelCase한 부분을 발견했으므로 이를 표시한 뒤
camelCase = true;
// 입력받은 대문자를 밑줄 + 소문자로 변경해 저장
ans[i++] = '_';
ans[i++] = c - 'A' + 'a';
}
// 첫 글자 이외의 부분에 밑줄이 들어왔다면
else if (c == '_' && i) {
// snake_case한 부분을 발견했으므로 이를 표시한 뒤
snake_case = true;
// 다음 글자를 입력받아
scanf("%c", &c);
// 해당 글자가 소문자라면 대문자로 변경해 저장
if (is_small(c)) ans[i++] = c - 'a' + 'A';
// 그렇지 않다면 에러를 표시하기 위해 camelCase를 true로 변경
else camelCase = true;
}
// 이 이외의 모든 입력은 부적절한 변수명을 뜻하므로 에러를 표시
else camelCase = snake_case = true;
}
// 변수명에 에러가 발생하지 않았다면 변환한 변수명을, 아니라면 "Error!"를 출력
printf("%s\n", !(camelCase && snake_case) ? ans : "Error!");
return 0;
}
'알고리즘 > 문제 풀이' 카테고리의 다른 글
4153번: 직각삼각형 (0) | 2021.12.22 |
---|---|
4150번: 피보나치 수 (0) | 2021.12.22 |
3190번: 뱀 (0) | 2021.12.22 |
3182번: 한동이는 공부가 하기 싫어! (0) | 2021.12.21 |
3053번: 택시 기하학 (0) | 2021.12.21 |