문제
시저 암호(Caesar Cipher)는 암호화 기술 중 하나로,
문자열의 각 문자를 알파벳 내에서 일정한 거리만큼 이동시켜 암호화하는 방식입니다.
예를 들어, 'A'에서 두 칸 오른쪽으로 이동하면 'C'가 되고, 'Z'는 'B'가 됩니다.
이 문제에서는 주어진 문자열을 시저 암호화하여 암호화된 문자열을 출력해야 합니다.
주어진 문자열에 대해:
- 각 문자를 K만큼 오른쪽으로 이동시켜 암호화합니다.
- K가 26을 초과하는 경우, 알파벳 수(26)로 나누어 K를 단축시킬 수 있습니다.
- 소문자, 대문자, 숫자, 기호는 각각 별도로 처리됩니다.
- 소문자는 소문자 범위 내에서, 대문자는 대문자 범위 내에서 이동합니다.
- 알파벳 이외의 문자는 그대로 유지됩니다.
입력
11
middle-Outz
2
출력
okffng-Qwvb
문제 해결 전략
각 알파벳 문자를 ASCII 코드로 변환한 다음,
A 또는 a의 ASCII 코드 값을 빼면 알파벳 내에서의 위치가 나옵니다.
예를 들어, 'a'의 위치는 ord('a') - ord('a') = 0입니다.
주어진 이동 거리 K만큼 위치를 이동한 후,
새로운 문자의 ASCII 값을 계산하여 변환된 문자를 찾습니다.
알파벳이 아닌 문자는 그대로 유지됩니다.
풀이 코드
ord(), chr()을 이용한 풀이
ASCII 코드 값을 상호 변환하는 데 사용하는 파이썬 내장함수를 사용합니다.
chr(97)
# 출력: 'a'
ord('a')
# 출력: 97
풀이
def caesarCipher(s, k):
# 결과 문자열을 저장할 리스트
result = []
# k가 26보다 크면, 알파벳 내에서 몇 칸 이동할지 결정
# ord('z') - ord('a') = 25 이므로, z 이후에는 다시 a로 돌아가야 함
k = k % 26
# 입력 문자열 s의 각 문자에 대해 변환 작업 수행
for char in s:
if char.islower(): # 소문자
new_char = chr((ord(char) - ord('a') + k) % 26 + ord('a'))
elif char.isupper(): # 대문자
new_char = chr((ord(char) - ord('A') + k) % 26 + ord('A'))
else: # 알파벳이 아닌 문자는 그대로 유지
new_char = char
result.append(new_char)
# 리스트를 문자열로 변환하여 반환
return ''.join(result)
# 예시 실행
s = "middle-Outz"
k = 2
print(caesarCipher(s, k)) # 출력: "okffng-Qwvb"
'Programming > CodingTest' 카테고리의 다른 글
| [HackerRank] Marc's Cakewalk (마크케이크웍) Greedy 문제 (0) | 2024.08.25 |
|---|---|
| [HackerRank] Gemstones (잼스톤) Strings 문제 (0) | 2024.08.21 |
| [HackerRank] Forming a Magic Square (마방진) Implementation 문제 (0) | 2024.08.18 |
| [HackerRank] Electronics Shop (전자제품상점) Implementation 문제 (0) | 2024.08.18 |
| [HackerRank] Sales by Match (양말 판매상) Implementation 문제 (0) | 2024.08.17 |