문제 설명
문제
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!"를 출력한다.
풀이 과정
- 와.. 쉬운줄 알았는데 예외처리 할게 생각보다 너무 많아서 소스가 되게 길어짐..
- 예외 처리 많이 생각해보기. 많이 틀렸음..
- 2가지 과정으로 진행한다.
- 해당 문자열이 C++ 변수명인지 JAVA 변수명인지 ERROR인지 판별
- C++이나 JAVA라면 각각 JAVA, C++ 변수명으로로 변환시켜 주기
- C++/JAVA/ERROR 판별
- 첫글자가 대문자이거나 _ 가 나오는 경우 에러(Ab , b_ )
- 마지막 글자에 _ 가 나오는 경우 에러(ab_)
- ' _ ' 가 중복되어 두번 나오면 에러(ab__cd)
- 대문자와 _ 가 동시에 나오는 경우 에러
- 이외의 경우에 대해서
- _ 가 나온 경우 -> c++
- 대문자가 나온 경우 -> java
- 판별이 되었다면 문자열을 바꾸어 준다.
- _ 의 경우는 해당 문자를 없애고 뒷 문자를 대문자로 (C++ -> Java)
- 대문자의 경우는 _ 문자 + 소문자로 변환 (Java -> C++)
소스 코드
import sys
def mode_check(s):
upp_count = 0
underbar_count = 0
dup = 0
dup_flag = False
if len(s) > 0 and s[0].isupper():
return 'ERROR'
if len(s) > 0 and s[0] == '_':
return 'ERROR'
if len(s) > 0 and s[-1] == '_':
return 'ERROR'
for c in s:
if c.isupper():
upp_count += 1
dup = 0
elif c == '_':
underbar_count += 1
dup += 1
if dup == 2:
return 'ERROR'
else:
dup = 0
if upp_count != 0 and underbar_count != 0:
return 'ERROR'
if underbar_count > 0:
return 'C'
else:
return 'JAVA'
def convert_java_to_cpp(s):
cv = ''
for c in s:
if ord('A') <= ord(c) and ord(c) <= ord('Z'):
cv += '_'
cv += c.lower()
else:
cv += c
return cv
def convert_cpp_to_java(s):
cv = ''
upper_flg = False
for c in s:
if c == '_':
upper_flg = True
else:
if upper_flg:
cv += c.upper()
upper_flg = False
else:
cv += c
return cv
variable_name = sys.stdin.readline().rstrip('\n')
mode = mode_check(variable_name)
if mode == 'JAVA':
print(convert_java_to_cpp(variable_name))
elif mode == 'C':
print(convert_cpp_to_java(variable_name))
else:
print('Error!')
'알고리즘[Python] > 백준 알고리즘' 카테고리의 다른 글
[ 2468 ] [ BFS ] 안전 영역 (0) | 2021.08.23 |
---|---|
[ 1283 ] [ String ] 단축키 지정 (0) | 2021.08.22 |
[ String ] 짧은 문제 (0) | 2021.08.21 |
[ 1939 ] [ Dijkstra ] 중량제한 (0) | 2021.08.20 |
[ 4195 ] [ Union-find ] 친구 네트워크 (0) | 2021.08.18 |