[Python] 코딩 도장 - 시저 암호 풀기

Updated:

코딩 도장 사이트의 문제를 직접 풀어본 내용을 정리하여 올립니다.

코딩 도장에서 여러 문제를 확인할 수 있습니다.

난이도 순으로 차근차근 풀어보려 합니다.


[문제: 시저 암호 풀기] - Lv.1

시저 암호는, 고대 로마의 황제 줄리어스 시저가 만들어 낸 암호인데,

예를 들어 알파벳 A를 입력했을 때, 그 알파벳의 n개 뒤에 오는(여기서는 예를 들 때 3으로 지정하였다)알파벳이 출력되는 것이다.

예를 들어 바꾸려는 단어가 ‘CAT”고, n을 5로 지정하였을 때 “HFY”가 되는 것이다.

어떠한 암호를 만들 문장과 n을 입력했을 때 암호를 만들어 출력하는 프로그램을 작성해라.

출처: https://codingdojang.com/scode/555?answer_mode=hide


[풀이]

import string 

# 대문자 알파벳
alphabet = string.ascii_uppercase

# input
x = input("영단어를 입력하세요.")
n = int(input("자연수 n을 입력하세요."))
answer = ""

for i in range(len(x)):
    # 만약 알파벳 26번째를 넘어가면 다시 A부터 출력
    idx = (alphabet.find(x.upper()[i]) + n) % 26
    answer += alphabet[idx]
    
print(answer)
영단어를 입력하세요.CaT
자연수 n을 입력하세요.5
HFY

우선 알파벳 문자열을 만드는데 포커스를 두었다.

직접 입력하는 것보다 파이썬 내에 알파벳이 있을 것 같아 찾아보니 string 패키지로 알파벳 문자열을 불러올 수 있었다.

그 후엔 입력받은 영단어와 n에 따라 인덱스를 바꿔 출력하게끔 구성했다.

혹시나 Z라는 단어가 있다면 다음 알파벳이 없기에 다시 A부터 출력되게끔 만들었다.


[추천 풀이]

def enig(inp, n) :
    s, res = 'aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ', ''
    for M in inp :
        if M in s : res += s[(s.index(M)+2*n)%52]
        else : res += M
    return res
INP = str(input("INPUT : "))
N = int(input("N : "))
print(enig(INP, N))
INPUT : CaT
N : 5
HfY

다른 분이 푸신 풀이 중 추천 수가 많은 풀이이다.

풀이 자체는 비슷한데 이 분은 대소문자도 그대로 반영해서 코드를 짜셨다.

[참고]

import string 

print(string.ascii_lowercase) # 소문자
print(string.ascii_uppercase) # 대문자
print(string.ascii_letters)   # 대소문자 모두
print(string.digits)          # 숫자
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789

위 코드는 string 패키지에서 알파벳과 숫자를 출력하는 예시이다.

for x in range(97,123):
    print(chr(x), end="")

print("\n", ord("a"))
abcdefghijklmnopqrstuvwxyz
 97

위 코드는 아스키 코드에 따라 알파벳을 출력하는 예시이다.

chr()을 이용해서 아스키 코드 문자를 출력할 수 있으며, ord()를 사용하면 아스키 코드를 출력 가능하다.

아래는 아스키 코드표이다.

10진 16진 문자 10진 16진 문자 10진 16진 문자 10진 16진 문자
0 0x00 NUL 32 0x20 SP 64 0x40 @ 96 0x60 `
1 0x01 SOH 33 0x21 ! 65 0x41 A 97 0x61 a
2 0x02 STX 34 0x22 66 0x42 B 98 0x62 b
3 0x03 ETX 35 0x23 # 67 0x43 C 99 0x63 c
4 0x04 EOT 36 0x24 $ 68 0x44 D 100 0x64 d
5 0x05 ENQ 37 0x25 % 69 0x45 E 101 0x65 e
6 0x06 ACK 38 0x26 & 70 0x46 F 102 0x66 f
7 0x07 BEL 39 0x27 71 0x47 G 103 0x67 g
8 0x08 BS 40 0x28 ( 72 0x48 H 104 0x68 h
9 0x09 HT 41 0x29 ) 73 0x49 I 105 0x69 i
10 0x0A LF 42 0x2A * 74 0x4A J 106 0x6A j
11 0x0B VT 43 0x2B + 75 0x4B K 107 0x6B k
12 0x0C FF 44 0x2C , 76 0x4C L 108 0x6C l
13 0x0D CR 45 0x2D - 77 0x4D M 109 0x6D m
14 0x0E SO 46 0x2E . 78 0x4E N 110 0x6E n
15 0x0F SI 47 0x2F / 79 0x4F O 111 0x6F o
16 0x10 DLE 48 0x30 0 80 0x50 P 112 0x70 p
17 0x11 DC1 49 0x31 1 81 0x51 Q 113 0x71 q
18 0x12 DC2 50 0x32 2 82 0x52 R 114 0x72 r
19 0x13 DC3 51 0x33 3 83 0x53 S 115 0x73 s
20 0x14 DC4 52 0x34 4 84 0x54 T 116 0x74 t
21 0x15 NAK 53 0x35 5 85 0x55 U 117 0x75 u
22 0x16 SYN 54 0x36 6 86 0x56 V 118 0x76 v
23 0x17 ETB 55 0x37 7 87 0x57 W 119 0x77 w
24 0x18 CAN 56 0x38 8 88 0x58 X 120 0x78 x
25 0x19 EM 57 0x39 9 89 0x59 Y 121 0x79 y
26 0x1A SUB 58 0x3A : 90 0x5A Z 122 0x7A z
27 0x1B ESC 59 0x3B ; 91 0x5B [ 123 0x7B {
28 0x1C FS 60 0x3C < 92 0x5C |124 0x7C |  
29 0x1D GS 61 0x3D = 93 0x5D ] 125 0x7D }
30 0x1E RS 62 0x3E > 94 0x5E ^ 126 0x7E ~
31 0x1F US 63 0x3F ? 95 0x5F _ 127 0x7F DEL

Leave a comment