게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
모니터 권장)휴학한 수학과학생의 맨땅코딩일기 (1) 2018/05/03
게시물ID : programmer_22373짧은주소 복사하기
작성자 : partei
추천 : 0
조회수 : 1038회
댓글수 : 10개
등록시간 : 2018/05/04 01:52:49
옵션
  • 창작글
  • 외부펌금지
'''
ecrypt.py
'''

동기 : 오유에서 파이썬을 C로 바꿔달라는 글을 보고 하게 되었습니다. 파이썬으로만 작성해봤습니다.
목적 : 주어진 영어문장에서 알파벳의 순서를 3칸씩 뒤로 가게 만들어 주게 하는 프로그램

ALPHABET = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z']

아래는 처음 생각
# len(A) = 26 #
# list boundary is from 0 to 26 #
# We want to make 'abc' -> 'xyz'
# 012 -> 24 25 26 <=> -3 -2 -1

먼저, 목표설정을 하고 구상을 했습니다. 그에 따라 알고 있는 것이 무엇인지 파악했습니다.

사실)알파벳은 26개이고, 파이썬의 list에서 양의 나머지는 그에 대응하는 음의 나머지와 같습니다.
idea) 알파벳의 순서를 3칸을 뒤로 넘길 겁니다. 즉, a는 x로, b는 y로, c는 z로 바꿔줄 겁니다.

위키백과에 따르면 list는 순서가 정해진 값의 나열을 의미합니다. 순서가 있기 때문에 list에 순서를 입력해주면 그 순서에 해당하는 값이 출력됩니다.
그런데, 자연수만 입력할 수 있는 게 아니라 음의 정수도 입력할 수 있습니다. 파이썬에서 list의 색인은 음의 나머지와 똑같습니다.
쉽게 예를 들자면, 사탕 42개를 26명에게 똑같이 나눠줄 때 몇개가 남는지 생각해봅시다. 42개를 26명에게 나눠주면 1개씩
26개를 나눠주게 되므로 16개가 남습니다. 이는 2개씩 나눠주려면(52명에게 1개씩) 10개가 부족함과 똑같습니다.

즉, '42개를 26명에게 똑같이 나눠준다' = 42 / 26 = 26*1 + 16 = 26 + 26 - 26 + 16 = 26*2 - 10

이 내용을 list에 적용해봅시다.

A = ['b', 'a', 'a', 'a', 'a', 'a'] 라는 list가 있습니다. 색인의 번호는 list의 길이가 6이니 6로 나눌 때의 나머지입니다.

(나누는 수가 n이라면 나머지는 항상 0 ~ n - 1)

0 1 2 3 4 5 => 'b' 'a' 'a' 'a' 'a' 'a'

7로 나눠서 나머지가 1이 나왔습니다. 나머지가 1이니까 7 / 6 = 6 + 1 = 7 - 6 + 6 = 13 - 6 = 2*6 - 5

그러므로, A[0] = A[-6] = 'a', A[1] = A[-5] = 'b'


def find_indexnumberencrypt(input_yourcode):
'''
encrypt 'abc' -> 'xyz'
'''

output_list = []
for INPUTS_ALPHABET in input_yourcode:
for ALPHABET_INDEX in range(len(ALPHABET)):
if INPUTS_ALPHABET == ALPHABET[ALPHABET_INDEX]:
output_list.append(ALPHABET_INDEX)

append는 '첨부하다'라는 뜻인데 output_list라는 list에 괄호 안의 데이터를 주어진 list에 넣어주도록 하는 명령어입니다.
output_list에 주어진 알파벳의 순서를 넣어주려고 합니다. 'a' -> 0, 'b' -> 1 etc.
그래서 append를 이용했습니다. 더 좋은 방법이 있다면 언제든지 적어주시면 감사하겠습니다!

list에 1:'a' 같은 dictionary 형태의 데이터는 넣을 수 없습니다.
tuple(순서쌍), int(정수), double(실수), list, set 형태의 자료는 넣을 수 있었습니다.

혹여 빠진 게 있다면 덧글로 피드백 해주시면 감사하겠습니다.

break

'''
for ALPHABET_INDEX in range(len(ALPHABET)):
for INPUTS_ALPHABET in input_yourcode:
if INPUTS_ALPHABET == ALPHABET[ALPHABET_INDEX]:
output_list.append(ALPHABET_INDEX)
위 for이 처음에 했던 건데 이건 예상했던 결과와 다르게 출력을 했습니다. (위 for은 i)의 for입니다.)
['a','a','b','a']라면 [0, 0, 1, 0]로 output_list가 나와야 하는데 [0,0,0,1]
즉, 정렬(sort)을 시켜줬습니다.
왜 그런가 IDLE를 돌려보았습니다.

잘 확인이 안돼서 이렇게 바꿔서 했습니다.

for ALPHABET_INDEX in range(len(ALPHABET)):
print(ALPHABET_INDEX)
print("AAAAAAAAAAAAAAAAAA")
for INPUTS_ALPHABET in input_yourcode:
print(INPUTS_ALPHABET)
print("HIHIHIHIHIHIHIHI")
if INPUTS_ALPHABET == ALPHABET[ALPHABET_INDEX]:
output_list.append(ALPHABET_INDEX)
print(output_list)
print("CCCCCCCCCCCCCCCCCCCCCCC")
i) 위 for을 돌렸을 때 ( 넣은 값 input_yourcode = ['a','b','a','a'])

--> 다음과 같은 결과가 나왔습니다. ( 결과 :['a','b','a','a'] --> [0,0,0,1] )
0
AAAAAAAAAAAAAAAAAA
    a
    HIHIHIHIHIHIHIHI
    [0]
    CCCCCCCCCCCCCCCCCCCCCCC
    b
    HIHIHIHIHIHIHIHI
    a
    HIHIHIHIHIHIHIHI
    [0, 0]
    CCCCCCCCCCCCCCCCCCCCCCC
    1
    AAAAAAAAAAAAAAAAAA
    a
    HIHIHIHIHIHIHIHI
    b
    HIHIHIHIHIHIHIHI
    [0, 0, 1]


ii) for INPUTS_ALPHABET in input_yourcode:를 돌린 결과 ( 넣은 값 input_yourcode = ['a','b','a','a'])

--> 다음과 같은 결과가 나왔습니다. ( 결과 : ['a','b','a','a'] --> [0,1,0,0] )
a
AAAAAAAAAAAAAAAAAA
0
HIHIHIHIHIHIHIHI
[0]
CCCCCCCCCCCCCCCCCCCCCCC
1
HIHIHIHIHIHIHIHI
2
HIHIHIHIHIHIHIHI
3
HIHIHIHIHIHIHIHI
4
HIHIHIHIHIHIHIHI
5
HIHIHIHIHIHIHIHI
6
HIHIHIHIHIHIHIHI
7
HIHIHIHIHIHIHIHI
8
HIHIHIHIHIHIHIHI
9
HIHIHIHIHIHIHIHI
10
HIHIHIHIHIHIHIHI
11
HIHIHIHIHIHIHIHI
12
HIHIHIHIHIHIHIHI
13
HIHIHIHIHIHIHIHI
14
HIHIHIHIHIHIHIHI
15
HIHIHIHIHIHIHIHI
16
HIHIHIHIHIHIHIHI
17
HIHIHIHIHIHIHIHI
18
HIHIHIHIHIHIHIHI
19
HIHIHIHIHIHIHIHI
20
HIHIHIHIHIHIHIHI
21
HIHIHIHIHIHIHIHI
22
HIHIHIHIHIHIHIHI
23
HIHIHIHIHIHIHIHI
24
HIHIHIHIHIHIHIHI
25
HIHIHIHIHIHIHIHI
iii)비교했더니 다음과 같은 결론이 나왔습니다.
i)는 a부터 z까지 문자의 개수를 먼저 세준다. 왜냐하면 주어진 list를 a로 훑고 나서 그 다음 문자로 훑기 때문입니다.
ii)는 예상한 결과를 도출했습니다. ii)의 'for'이 우리가 넣은 첫번째 문자를 a부터 z까지 비교하고, 다음 문자로 넘어가는 것이었습니다.
(이 생각은 MATLAB에서 list끼리 boolean을 이용해서 똑같은지 다른지 비교할 수 있다는 점에서 착안했습니다.)
iv) if뒤에 break를 추가했습니다. 굳이 불필요한 연산을 하고 싶지 않았습니다.
그렇게 ['a','b','a','a']를 [0,1,0,0]로 바꾸는데 성공했습니다.
이제 [0,1,0,0]을 이용해서 'aaba'(python에서 string을 list처럼 생각할 수 있습니다.)를 'xxyx'로 바꿔야 합니다.
output_string = ''

'a'에서 'x'를 도출하고, 'b'에서 'y'를 도출한 결과물을 더해야 합니다. 붙여주려면.
계산하기 전에는 아무 것도 없도록 설정해줬습니다.

for component_of_list in output_list:
output_string += ALPHABET[component_of_list - 3] # A[0] = 'a' -> A[24 == -3] = 'x'
여기는 각 알파벳을 뒤로 3칸을 보내고 하나의 문자열로 만들어주는 과정입니다.
# ['a', 'x', 'u'] -> 'x'+'u'+'r' -> 'xur'
output = output_string
우리가 더한 문자열을 출력값으로 해줍니다.
return output
출력값을 함숫값으로 설정해줍니다.


결과 : 'whereareyou' -> 'tebobxobvlr'

>>> encrypt.find_indexnumberencrypt('where are you?!')
'tebobxobvlr'

부족한 점: 띄어쓰기를 반영해야 함 & '?'나 '!' 같은 문장부호도 그대로 넣도록 해야 함.



출처 머리와 python 설치하면 주는 IDLE // Visual studio code
꼬릿말 보기
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호