Algorithm/String

[HackerRank] Caesar Cipher

킹우현 2023. 5. 19. 19:51

def caesarCipher(s, k):
    # Write your code here
    length = len(s)
    str_list = list(s)
    k %= 26
    
    for i in range(length):
        char_ord = ord(str_list[i])
        
        if char_ord >= ord('A') and char_ord <= ord('Z'):
            if char_ord + k > ord('Z'):
                diff = ord('Z') - char_ord
                index = (ord('A')-1) + (k-diff)
                str_list[i] = chr(index)
            else:
                str_list[i] = chr(char_ord+k)
        
        elif char_ord >= ord('a') and char_ord <= ord('z'):
            if (char_ord+k) > ord('z'):
                diff = ord('z') - char_ord
                index = (ord('a')-1) + (k-diff)
                str_list[i] = chr(index)
            else:
                str_list[i] = chr(char_ord+k)
    
    return ''.join(str_list)

이번 문제는 주어진 문자열을 아스키 코드 기준으로 k 만큼 이동하여 변환시키는 문제이다.

 

단순히 k만큼만 더해주면 되는 줄 알았는데 테스트케이스가 몇개씩 틀려서 확인해본 결과, 생각보다 조건들을 많이 고려해야 하는 문제였다. 이번 문제를 통해 배운 점은 다음과 같이 정리할 수 있다.

  1. 문자를 아스키코드 수로 변환하는 함수는 ord(), 아스키코드 수를 문자로 변환하는 함수는 chr() 이다.
  2. 알파벳 대문자와 소문자는 32만큼 차이가 난다.
  3. 문제를 제대로 읽지 않고 테스트케이스를 하나씩 맞추는 것 보다, 문제와 전제조건을 정확히 읽고 확실하게 푸는 것이 훨씬 효율적이므로 문제를 제대로 읽는 연습을 하자 ⭐️⭐️⭐️