문제를 해결하기 까지 몇가지 이유로 오류가 났다.
파이썬에서는 문자열이 변경 불가능하다.
소문자, 대문자를 구분하는 방법.
리스트에 있는 값을 문자열로 바꾸는 방법.
자세한 설명은 게시글 맨 밑에 기술
Baekjoon Online Judge
Onrxwbba Bayvar Whqtr
One is 1
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))
# 문자 또는 문자열 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)을 더한 값을 빼주었다.
풀어서 설명하면
이런 방식으로 만들었는데 범위를 벗어난다며 오류가 났다. 알파벳이 26개이기 때문에 그냥 -26을 하면 처음 범위로 돌아간다. 위의 식도 결국 값을 처리하면 아래 처럼 -26이 된다.
괜히 복잡하게 해서 실행이 되지 않았다. 근데 결국 값은 같은데 왜 오류가 나는지는 의문이다. 연산 과정 때문에 그런것 같기는 해도 좀 아쉽다.