[Baekjoon] 3613/Java vs C++/Python/파이썬

·2025년 3월 9일
0

문제풀이

목록 보기
46/56
post-thumbnail

💡문제

Java 예찬론자 김동규와 C++ 옹호가 김동혁은 서로 어떤 프로그래밍 언어가 최고인지 몇 시간동안 토론을 하곤 했다. 동규는 Java가 명확하고 에러가 적은 프로그램을 만든다고 주장했고, 동혁이는 Java는 프로그램이 느리고, 긴 소스 코드를 갖는 점과 제네릭 배열의 인스턴스화의 무능력을 비웃었다.

또, 김동규와 김동혁은 변수 이름을 짓는 방식도 서로 달랐다. Java에서는 변수의 이름이 여러 단어로 이루어져있을 때, 다음과 같은 방법으로 변수명을 짓는다.

첫 단어는 소문자로 쓰고, 다음 단어부터는 첫 문자만 대문자로 쓴다. 또, 모든 단어는 붙여쓴다. 따라서 Java의 변수명은 javaIdentifier, longAndMnemonicIdentifier, name, bAEKJOON과 같은 형태이다.

반면에 C++에서는 변수명에 소문자만 사용한다. 단어와 단어를 구분하기 위해서 밑줄('_')을 이용한다. C++ 변수명은 c_identifier, long_and_mnemonic_identifier, name, b_a_e_k_j_o_o_n과 같은 형태이다.

이 둘의 싸움을 부질없다고 느낀 재원이는 C++형식의 변수명을 Java형식의 변수명으로, 또는 그 반대로 바꿔주는 프로그램을 만들려고 한다. 각 언어의 변수명 형식의 위의 설명을 따라야 한다.

재원이의 프로그램은 가장 먼저 변수명을 입력으로 받은 뒤, 이 변수명이 어떤 언어 형식인지를 알아내야 한다. 그 다음, C++형식이라면 Java형식으로, Java형식이라면 C++형식으로 바꾸면 된다. 만약 C++형식과 Java형식 둘 다 아니라면, 에러를 발생시킨다. 변수명을 변환할 때, 단어의 순서는 유지되어야 한다.

재원이는 프로그램을 만들려고 했으나, 너무 귀찮은 나머지 이를 문제를 읽는 사람의 몫으로 맡겨놨다.

재원이가 만들려고 한 프로그램을 대신 만들어보자.

입력

첫째 줄에 변수명이 주어진다. 영어 알파벳과 밑줄('_')로만 이루어져 있고, 길이는 100을 넘지 않는다.

출력

입력으로 주어진 변수명이 Java형식이면, C++형식으로 출력하고, C++형식이라면 Java형식으로 출력한다. 둘 다 아니라면 "Error!"를 출력한다.

예제입력

long_and_mnemonic_identifier

예제출력

longAndMnemonicIdentifier

📖내가 작성한 Code

import sys

'''
걍 빡구현
'''


def find_type(string):
    if string[0] == "_" or string[-1] == "_" or "__" in string:
        return "Error!"

    split_string = string.split('_')

    if len(split_string) > 1:
        if any(any(c.isupper() for c in word) for word in split_string):
            return "Error!"
        first_str = split_string[0]
        for word in split_string[1:]:
            first_str += (word[0].upper() + word[1:])
        return first_str

    if string[0].isupper():
        return "Error!"

    result = []
    for alpha in string:
        if alpha.isupper():
            result.append('_' + alpha.lower())
        else:
            result.append(alpha)
    return "".join(result)


def main():
    inputs = sys.stdin.readline().rstrip()

    if not inputs or inputs[0].isupper():
        sys.stdout.write('Error!')
        return

    sys.stdout.write(find_type(inputs))


if __name__ == "__main__":
    main()

✍️풀이과정

그냥 빡구현 문제. 여러 예외 상황(엣지 케이스)를 상상하면서 풀었음.


🧠 코드 리뷰

  1. 함수 분리 : 코드가 하나의 큰 함수(find_type)와 main 함수로 나뉘어 있어 기본적인 역할 분리는 잘 되어 있습니다. 다만, C++ 스타일 → Java 스타일 변환과 Java 스타일 → C++ 스타일 변환 로직을 별도의 함수로 분리하면 각 변환 로직의 책임이 명확해져서 가독성과 유지보수성이 더욱 향상될 수 있습니다.

  2. 중복 체크 : main 함수에서 입력이 비어있거나 첫 글자가 대문자인지 다시 체크하는 부분은 find_type 내의 검사와 일부 중복됩니다.
    중복된 검증은 함수 내부로 모두 옮기거나 main에서 한 번만 검증하도록 개선할 수 있습니다.


🛠️AI 개선 코드

import sys

def convert_cpp_to_java(identifier: str) -> str:
    """
    C++ 스타일(underscore_separated) 식별자를 Java 스타일(camelCase)로 변환합니다.
    
    변환 조건:
    - 식별자는 '_'로 시작하거나 끝나지 않아야 하며, 연속된 '_'가 없어야 합니다.
    - 각 단어에는 대문자가 없어야 합니다.
    
    올바르지 않은 경우 "Error!"를 반환합니다.
    """
    if identifier.startswith('_') or identifier.endswith('_') or '__' in identifier:
        return "Error!"
    
    parts = identifier.split('_')
    for part in parts:
        if any(char.isupper() for char in part):
            return "Error!"
    
    # 첫 단어는 그대로, 이후 단어의 첫 글자만 대문자로 변환하여 이어붙임.
    java_identifier = parts[0]
    for part in parts[1:]:
        if part:
            java_identifier += part[0].upper() + part[1:]
    return java_identifier

def convert_java_to_cpp(identifier: str) -> str:
    """
    Java 스타일(camelCase) 식별자를 C++ 스타일(underscore_separated)로 변환합니다.
    
    변환 조건:
    - 식별자는 대문자로 시작하면 안 됩니다.
    
    올바르지 않은 경우 "Error!"를 반환합니다.
    """
    if identifier and identifier[0].isupper():
        return "Error!"
    
    cpp_identifier = []
    for char in identifier:
        if char.isupper():
            cpp_identifier.append('_')
            cpp_identifier.append(char.lower())
        else:
            cpp_identifier.append(char)
    return "".join(cpp_identifier)

def convert_identifier(identifier: str) -> str:
    """
    식별자의 스타일(C++ 스타일 또는 Java 스타일)을 판별한 후 반대 스타일로 변환합니다.
    
    - 식별자에 '_'가 포함되어 있으면 C++ 스타일로 간주하여 Java 스타일로 변환합니다.
    - 그렇지 않으면 Java 스타일로 간주하여 C++ 스타일로 변환합니다.
    
    올바르지 않은 식별자인 경우 "Error!"를 반환합니다.
    """
    if '_' in identifier:
        return convert_cpp_to_java(identifier)
    else:
        return convert_java_to_cpp(identifier)

def main():
    """
    표준 입력에서 식별자를 읽어 변환 후 결과를 표준 출력으로 출력합니다.
    """
    input_line = sys.stdin.readline().strip()
    
    # 입력이 빈 문자열이면 에러 처리.
    if not input_line:
        sys.stdout.write("Error!")
        return
    
    result = convert_identifier(input_line)
    sys.stdout.write(result)

if __name__ == "__main__":
    main()

💻결과

백준문제 보러가기


🖱️참고 링크

파이썬 문자열 자료형 참고

profile
우물 안에서 무언가 만드는 사람

0개의 댓글