일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 모의해킹
- SQL 정리
- 코딩테스트
- 프로그래밍
- c언어
- 필기
- 파이썬
- 스파크
- 데이터베이스
- 오라클
- 위클리챌린지
- 빅데이터
- 프로그래머스
- 자바
- 스프링부트
- 해킹실습
- 데이터프로그래밍
- 기초
- 문제풀이
- 문법
- SQL
- 엘라스틱서치
- 백준
- 이클립스
- SQL 문법
- 리눅스마스터 2급 2차
- 토이프로젝트
- 알고리즘
- 스프링
- MySQL
- Today
- Total
개발일기
백준 1718번 파이썬 풀이 : 암호 본문
문제 링크 : https://www.acmicpc.net/problem/1718
1718번: 암호
Vigenere cipher이라는 암호화 방법은 암호화하려는 문장 (평문)의 단어와 암호화 키를 숫자로 바꾼 다음, 평문의 단어에 해당하는 숫자에 암호 키에 해당하는 숫자를 더하는 방식이다. 이 방법을 변
www.acmicpc.net
문제
Vigenere cipher이라는 암호화 방법은 암호화하려는 문장 (평문)의 단어와 암호화 키를 숫자로 바꾼 다음, 평문의 단어에 해당하는 숫자에 암호 키에 해당하는 숫자를 더하는 방식이다. 이 방법을 변형하여 평문의 단어에 암호화 키에 해당하는 숫자를 빼서 암호화하는 방식을 생각해 보자.
예를 들어 암호화 키가 love이고, 암호화할 문장이 “nice day” 라면 다음과 같이 암호화가 이루어진다.
제시된 평문의 첫 번째 문자인 ‘n’은 해당 암호화 키 ‘l’의 알파벳 순서가 12 이므로 알파벳상의 순서에서 ‘n’보다 12앞의 문자인 ‘b’로 변형된다.
변형된 문자가 ‘a' 이전의 문자가 되면 알파벳 상에서 맨 뒤로 순서를 돌린다. 예를 들면 평문의 세 번째 문자인‘c’는 알파벳 상에서 3 번째이고 대응하는 암호화키 ‘v'는 알파벳 순서 22로 ‘c'에서 22 앞으로 당기면 ‘a'보다 훨씬 앞의 문자이어야 하는데, ‘a’앞의 문자가 없으므로 ‘z’로 돌아가 반복되어 ‘g’가 된다. 즉 평문의 문자를 암호화키의 문자가 알파벳 상에서 차지하는 순서만큼 앞으로 뺀 것으로 암호화한다.
평문의 문자가 공백 문자인 경우는 그 공백 문자를 그대로 출력한다.
이와 같은 암호화를 행하는 프로그램을 작성하시오.
입력
첫째 줄에 평문이, 둘째 줄에 암호화 키가 주어진다.
평문은 알파벳 소문자와 공백문자(space)로 만 구성되며, 암호화 키는 알파벳 소문자만으로 구성된다. 평문의 길이는 공백까지 포함해서 30000자 이하이다.
출력
첫 번째 줄에 암호문을 출력한다.
# 문제 풀이 ( 알고리즘 분류 : 문자열 )
문자열 사용 능력과 아스키코드에 대한 이해가 있다면 쉽게 풀 수 있을 것이라 생각된다.
1
2
3
4
5
6
|
string = input()
key = input()
answer = ''
alph_dict = ['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']
key_index = 0
|
cs |
string : 평문을 입력받을 변수
key : 암호화 키를 입력받을 변수
alph_dict : 알파벳 index를 얻기 위한 배열
1
2
3
4
|
for i in string:
if i == " ":
answer += " "
key_index += 1
|
cs |
평문을 하나씩 탐색하며 공백일 때는 공백을 그대로 answer에 추가시켜 주며 key_index (포인터)는 1증가시켜 준다.
1
2
3
4
5
6
|
else:
temp = ord(i) - alph_dict.index(key[key_index]) - 1
if temp < 97:
temp += 26
answer += chr(temp)
key_index += 1
|
cs |
temp 변수에 i를 아스키 코드로 변환 alph_dict 인덱스에서 key에 해당하는 index를 가져와 계산을 해준다.
temp 가 97보다 작으면 알파벳 소문자 a보다 작은 값이기 때문에 26을 더해주어 z부터 다시 시작하게 한다.
계산이 완료되면 chr을 사용하여 다시 알파벳으로 변환 answer에 추가한다.
1
2
|
if key_index == len(key):
key_index = 0
|
cs |
key_index가 key의 길이와 같으면 포인터를 맨 처음인 0으로 되돌려 다시 암호화 키부터 시작하게 한다.
# 전체 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
string = input()
key = input()
answer = ''
alph_dict = ['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']
key_index = 0
for i in string:
if i == " ":
answer += " "
key_index += 1
else:
temp = ord(i) - alph_dict.index(key[key_index]) - 1
if temp < 97:
temp += 26
answer += chr(temp)
key_index += 1
if key_index == len(key):
key_index = 0
print(answer)
|
cs |
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
백준 1864번 파이썬 풀이 : 문어 숫자 (0) | 2021.09.22 |
---|---|
백준 1371번 파이썬 풀이 : 가장 많은 글자 (0) | 2021.09.21 |
백준 1236번 파이썬 풀이 : 성 지키기 (0) | 2021.09.17 |
백준 1120번 파이썬 풀이 : 문자열 (0) | 2021.09.15 |
백준 5073번 파이썬 풀이 : 삼각형과 세 변 (0) | 2021.09.14 |