[BOJ_Python] 11655번 ROT13 (브론즈 1)

황준성·2024년 10월 26일
0

BOJ_Python

목록 보기
8/70

문제 11655

문제를 해결하기 까지 몇가지 이유로 오류가 났다.

  1. 파이썬에서는 문자열이 변경 불가능하다.

  2. 소문자, 대문자를 구분하는 방법.

  3. 리스트에 있는 값을 문자열로 바꾸는 방법.

    자세한 설명은 게시글 맨 밑에 기술

입력 예시 1

Baekjoon Online Judge

출력 예시 1

Onrxwbba Bayvar Whqtr

입력 예시 2

One is 1

출력 예시 2

Bar vf 1

내가 짠 코드

# BOJ 11655번 ROT13 

# 아스키코드 값
# 65(A)부터 90(Z)까지
# 97(a)부터 122(z)까지

# 대문자는 대문자 로테이션
# 소문자는 소문자 로테이션

s = input()

# 파이썬은 문자열 변경 불가능하기 때문에 직접 수정할 수 없음
result = []

for char in s:
    # 대문자 일때
    if (char.isupper() == True):
        value = ord(char) + 13
        if value > 90:
            value -= 26
        result.append(chr(value))
    # 소문자 일때
    elif (char.islower() == True):
        value = ord(char) + 13
        if value > 122:
            value -= 26
        result.append(chr(value))
    # 그 외에는 그대로
    else:
        result.append(char)

print("".join(result))

풀이 설명

문자열 변경 불가능

  • 파이썬에서는 문자열 변경이 불가능 하다고 한다. 그것 때문에 오류로 실행이 되지 않았다. 그렇기 때문에 리스트를 하나 만들고 한 글자씩 추가해주는 방식으로 로직을 만들어야 한다. 코드에서는 result 리스트가 그 역할을 한다.

대문자, 소문자 구분

  • 소문자, 대문자를 구분하기 위해서는 islower(), isupper() 함수를 사용하면 간단하다.
# 문자 또는 문자열 s가 있다고 가정하면

s = input()

s.isupper() # s가 대문자이면 True, 소문자이면 False를 반환함
s.islower() # s가 대문자이면 False, 소문자이면 True를 반환함

이를 이용해서 코드를 조금 더 깔끔하게 만들 수 있다.

for char in s:
   # 대문자 일때
   if char.isupper():
       value = ord(char) + 13
       if value > 90:
           value -= 26
       result.append(chr(value))
   # 소문자 일때
   elif char.islower():
       value = ord(char) + 13
       if value > 122:
           value -= 26
       result.append(chr(value))
   # 그 외에는 그대로
   else:
       result.append(char)

if문을 보면 "=="기호를 사용하여 True일때 실행을 했지만, islower(), isupper() 함수 자체가 True or False 값을 반환하기 때문에 굳이 == 연산자로 참인지 거짓인지 구분해줄 필요는 없음. 참이면 조건문이 실행되고 거짓이면 실행되지 않음.

리스트에 있는 값을 문자열로 변환

print("".join(result))

print("".join(result)) : 리스트의 모든 요소를 빈 문자열("")을 구분자로 사용하여 연결한다. 이렇게 하면 리스트에 있는 각 문자들이 하나의 문자열로 변환된다.

오류 났던 부분

범위를 벗어나는 것들 처리

대문자는 대문자 범위 안에서 변경이 되고, 소문자는 소문자 범위 내에서 변경이 된다.

  • 오류가 났던 코드
for char in s:
    # 대문자 일때
    if (char.isupper() == True):
        value = ord(char) + 13
        if value > 90:
            value -= ord("Z") + (ord("A") - 1)
        result.append(chr(value))
    # 소문자 일때
    elif (char.islower() == True):
        value = ord(char) + 13
        if value > 122:
            value -= ord("z") + (ord("a") - 1)
        result.append(chr(value))
    # 그 외에는 그대로
    else:
        result.append(char)

위 처럼 value 값에 13을 더한 값이 범위를 벗어나면, Z의 아스트 값에서 (A의 아스키 값 -1)을 더한 값을 빼주었다.

풀어서 설명하면

  • value = value - 90(ord("Z") + 64(ord("A") - 1)

이런 방식으로 만들었는데 범위를 벗어난다며 오류가 났다. 알파벳이 26개이기 때문에 그냥 -26을 하면 처음 범위로 돌아간다. 위의 식도 결국 값을 처리하면 아래 처럼 -26이 된다.

  • value = value - 26

괜히 복잡하게 해서 실행이 되지 않았다. 근데 결국 값은 같은데 왜 오류가 나는지는 의문이다. 연산 과정 때문에 그런것 같기는 해도 좀 아쉽다.

profile
Make progress

0개의 댓글