Hongfluenza

[pythonchallenge]파이썬 챌린지1번 문제 본문

CHALLENGE/pythonchallenge

[pythonchallenge]파이썬 챌린지1번 문제

Hongfluenza 2019. 1. 2. 23:32

1번 URL 주소 : http://www.pythonchallenge.com/pc/def/map.html




1번 문제는 다음과 같다.


예전에 암호수학 시간에 배웠던 개념이 생각나서 a-z까지 알파벳을 옆으로 두 칸 밀어보았더니 해답이 보였다.


코딩을 하기 전에, 간단하게 디자인을 해보았다.


1. a-z까지 알파벳을 원소로 갖는 리스트 a를 생성한다.

2. 리스트 a를 옆으로 두 칸 밀어 c-b까지 알파벳을 원소로 갖는 리스트 b를 생성한다.

3. 문제에 주어진 문장을 넣을 리스트 c를 생성한다.

4. 공백(' ')은 건너뛰고, 리스트 c의 원소와 리스트 a의 원소가 일치할 때, a의 인덱스 위치를 가져와, 리스트 b의 동일한 인덱스에 있는 값을 리스트 c의 원소에 대입해준다.


소스코드 >>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
a=['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']
 
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','a','b']
 
 
s="g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj."
 
c=list(s)
 
 
i,k=0,0
 
while True:
    if k >= len(c): 
        break;
    else:
        if 'a'>c[k] and 'z'<c[k]:    
            k +=1
            continue
        for i in range(26) :
            if a[i]==c[k] :
                c[k]=b[i]
                break
        k+=1
 
 
print(''.join(c))
 
cs


결과 >>
i hope you didnt translate it by hand. thats what computers are for. doing it in by hand is inefficient and that's why this text is so long. using string.maketrans() is recommended. now apply on the url.


1번 문제의 url을 자세히 보면 map.html인 것을 알 수 있는데, 이 map을 위의 문제와 동일하게 바꾸어주면, ocr이 나오게 된다.


map.html->ocr.html으로 바꾸어주면 다음 문제로 넘어갈 수 있다.



풀면서 나는 너무 쓸데없이 노가다를 한 것 같아서, 구글링을 통해서 조금 더 효율적이고 가독성 있는 코드를 참고했다.


또한 1번 문제를 통해서 새롭게 알아낸 string.maketrans() 함수를 사용해 해답을 다시 얻어내보겠다. 


참고 할 아스키코드 표이다.

출처 : https://shaeod.tistory.com/228


소스코드 >>


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ex = 'g fmnc wms bgblr rpylqjyrc gr zw fylb.rfyrq ufyr amknsrcpq ypc dmp.bmgle gr gl zw fylb gq glcddgagclr ylb rfyr\'q ufw rfgq rcvr gq qm jmle.sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.'
 
sen=[]
for x in ex:
    x = ord(x)
    if x!=32 and chr(x).isalpha():
        if x>120:
            sen.append(chr(x-24))
        else:
            sen.append(chr(x+2))
    else:
        sen.append(chr(x))
 
for x in sen:
    print(x,end='')
cs


실행 결과 >>

i hope you didnt translate it by hand. thats what computers are for. doing it in by hand is inefficient and that's why this text is so long. using string.maketrans() is recommended. now apply on the url.


그런 다음, 주어진 string.maketrans() 함수를 참고하여 1번 문제를 풀어 볼 것이다.


string.maketrans()

: 문자열을 치환해주는 함수. 숫자 가능. 단, 바꾸기 전/후의 문자의 길이가 같아야 한다.



소스 코드>>

1
2
3
4
5
6
7
8
import string
 
obj='market'
before='ket'
after='kne'
sen=obj.maketrans(before,after)
print(obj.translate(sen))
 
cs


실행 결과>>

markne


위의 예제 코드를 참고해 1번 문제의 url의 map을 바꾸기 위해 코드를 작성하면 다음과 같다.

소스 코드>>

1
2
3
4
5
6
7
import string
example='map'
before="abcdefghijklmnopqrstuvwxyz"
after="cdefghijklmnopqrstuvwxyzab"
sentence=example.maketrans(before,after)
print(example.translate(sentence))
 
cs


실행 결과>>ocr

출처 : http://websecurity.tistory.com/146