본문 바로가기

알고리즘 삽질장

[BOJ] 11655번 - ROT13

반응형


문제설명

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

 

11655번: ROT13

첫째 줄에 알파벳 대문자, 소문자, 공백, 숫자로만 이루어진 문자열 S가 주어진다. S의 길이는 100을 넘지 않는다.

www.acmicpc.net

사고과정

  • 처음에 아스키 코드로 13번째 뒤 문자를 의미하는 줄 알았으나 입력 예시를 쳐보고 그게 아니고 알파벳 대문자 ,소문자 상에서 각각 13번째 뒤를 의미하는 것을 깨달았다. 그래서 A~Z, a~z 별로 아스키 문자를 활용해 각 대문자, 소문자 리스트를 만들어주었다.
  • 문자열 하나씩 돌면서 알파벳 대문자 또는 소문자 일때, 각각의 대문자, 소문자 리스트를 참조하는데, 이 때 13번째 증가한 인덱스의 값으로 대체해주면 된다. 단, 13번째 인덱스를 더했을 때 대문자, 소문자 리스트 길이인 26을 넘어가게 되면 다시 앞으로 초기화 해주어야 한다.
  • 이를 구현하기 위해서 % 연산자를 사용. 예를 들어 20번째 인덱스에서 13 인덱스를 더하면 33인덱스이다. 이 때 33을 26으로 나눈 나머지(33 % 26)를 하게 되면 7이 나오게 되는데, 이 7이 바로 다시 0번 인덱스로 돌아간 후 7번째 인덱스를 의미한다!
  • 리스트 인덱스를 순회하는 문제를 그동안 풀어보고 매번 못풀었었는데 다행히 이번에는 잘 구현했다!

풀이

upper = [chr(ord('A') + i) for i in range(0, 26)]
lower = [chr(ord('a') + i) for i in range(0, 26)]
string = list(input())

for i in range(len(string)):
    # 대문자일 경우
    if string[i].isupper():
        up_idx = upper.index(string[i]) + 13
        if up_idx >= 26:
            up_idx %= 26
            string[i] = upper[up_idx]
        else:
            string[i] = upper[up_idx]
    # 소문자일 경우
    elif string[i].islower():
        low_idx = lower.index(string[i]) + 13
        if low_idx >= 26:
            low_idx %= 26
            string[i] = lower[low_idx]
        else:
            string[i] = lower[low_idx]
    # 공백이나 숫자일 경우 그냥 무시
    else:
        continue
print(''.join(string))
반응형

'알고리즘 삽질장' 카테고리의 다른 글

[BOJ] 11656번 - 접미사 배열  (0) 2021.10.26
[BOJ] 10824번 - 네 수  (0) 2021.10.26
[BOJ] 10820번 - 문자열 분석  (0) 2021.10.26
[BOJ] 10809번 - 알파벳 찾기  (0) 2021.10.26
[BOJ] 10808번 - 알파벳 개수  (0) 2021.10.26