알고리즘/문제 풀이

3613번: Java vs C++

Themion 2021. 12. 22. 11:10

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