민희의 코딩일지

[PYTHON] 백준 4446 ROT13 본문

자료구조, 알고리즘/파이썬

[PYTHON] 백준 4446 ROT13

heehminh 2023. 2. 5. 19:02
반응형

https://www.acmicpc.net/problem/4446

 

4446번: ROT13

간달프는 여러 종족의 언어를 꽤 오랜 시간 동안 공부했다. 최근에 간달프는 해커들이 사용하는 언어인 ROT13을 공부했다. 이 언어는 영어와 문법이 같지만, 알파벳의 순서를 어떤 규칙을 이용해

www.acmicpc.net

이 문제 완전 어이없다. 함정이 숨어있다.

 

풀이

모음과 자음 목록을 list로 만들어준다.

charisLower: 현재 알파벳이 소문자이면 True

대문자라면 소문자로 바꿔주고 알파벳을 ROT13에 맞게 바꿔준 후 다시 대문자로 바꿔준다. 

처음 시도를 했는데 틀렸습니다가 떴다.

틀린 코드는 다음과 같다. 

# 백준 4446번 ROT13 
string = input()

vowels = ["a", "i", "y", "e", "o", "u"]
consonats = ["b", "k", "x", "z", "n", "h", "d", "c", "w", "g", "p", "v", "j", "q", "t", "s", "r", "l", "m", "f"]


ans = ""
for char in string:
    charisLower = True
    
    if char.isupper():
        charisLower = False
        char = char.lower()
    
    if (char in vowels):
        changeChar = vowels[(vowels.index(char)+3) %6]
        ans += changeChar if charisLower else changeChar.upper()

    elif (char in consonats):
        changeChar = consonats[(consonats.index(char)+10) %20]
        ans += changeChar if charisLower else changeChar.upper()
        
    else:
        ans += char
print(ans)

그래서 다른 사람 풀이를 찾아봤는데 입력이 엄청 많이 들어가기 때문에 while로 무한 반복에 try except를 써야 정답 처리가 된다는 걸 알게 되었다. 그래서 무한 반복을 추가해주었더니 드디어 통과했다.

 

코드

# 백준 4446번 ROT13 
# 함정: 입력은 여러 줄로 이루어져 있다. 각 줄은 100글자 이내의 문장이고, 
# ROT13으로 쓰여진 문장이다. 이 문장의 각 글자는 ASCII 문자 공백(32) 부터 ~(126)까지이다. 

vowels = ["a", "i", "y", "e", "o", "u"]
consonats = ["b", "k", "x", "z", "n", "h", "d", "c", "w", "g", "p", "v", "j", "q", "t", "s", "r", "l", "m", "f"]

while(True):
    try: 
        string = input()
        
        ans = ""
        for char in string:
            charisLower = True
            
            if char.isupper():
                charisLower = False
                char = char.lower()
            
            if (char in vowels):
                changeChar = vowels[(vowels.index(char)+3) %6]
                ans += changeChar if charisLower else changeChar.upper()

            elif (char in consonats):
                changeChar = consonats[(consonats.index(char)+10) %20]
                ans += changeChar if charisLower else changeChar.upper()
                
            else:
                ans += char
        print(ans)
    except:
        break

 

참고

https://devlibrary00108.tistory.com/54

 

[백준][Python] 4446 ROT12

처음엔 ord chr 쓰는줄 알았는데 도저히 그쪽으론 설계가 안돼서 노가다로 풂. 문제 함정은 testcase는 하나 띡 놓고 실상은 입력이 겁나 많이 들어간다는 것. 때문에 while로 무한 반복에 try except까지

devlibrary00108.tistory.com

 

반응형
Comments