본문 바로가기
알고리즘/프로그래머스

[C++] 시저 암호(연습문제)

by 민-Zero 2020. 5. 3.

문제의 목표는 간단하다 카이사르 암호라고도 불리는 가장 오래된 암호법인 치환 암호를 구현하면 된다. 주어진 매개변수 s가 'a'이고 n이 2라면 'a'를 2번 밀어낸 'c'로 치환되는 것이다. 'z'에서 1을 밀어내면 'A'가 되는 것이 아닌 다시 처음인 'a'로 되돌아간다. 즉, 소문자는 소문자에서만 대문자는 대문자에서만 공백은 공백으로 치환하면 된다.

 

설계 및 구현

구현을 위해 주어진 함수는 평문 s와 치환을 위한 암호키 정수 n을 매개변수로 가진다. 구현 내용은 파이썬에서 고안한 내용과 새로 배운것을 활용하여 바로 코드를 작성해 보자.

① 소문자, 대문자 구분하여 조건 분리

② s의 문자들을 아스키코드 값으로 변경 후 a, A 로부터 몇번째 알파벳인지 확인하여 n을 더해 몇칸 이동인지 확인한다. 이때 알파벳의 갯수를 넘을경우 다시 처음으로 돌아와야 하므로 26으로 나눈 나머지를 활용한다.

③ 공백의 경우 그대로 공백으로 반환

 

①을 수행하기 위해 isupper(), islower() 함수를 사용했다. isupper() 함수는 입력받은 문자가 대문자면 1 아니라면 0을 반환한다. 마찬가지로 islower() 함수는 소문자가 아니라면 0을 반환한다.

구간의 반복은 치환할 문자열의 아스키코드값을 대소문자의 시작 부분 아스키코드값에 빼주어 구간에서 몇 번째 알파벳인지 알아낸 후 n을 더해 얼마큼 밀어내면 되는지 확인한다 이때 %26을 통해 z, Z를 넘어가게 된다면 다시 구간 안으로 들어올 수 있도록 해준 뒤 A, a의 아스키코드값에 더해 치환을 수행하여 범위를 초과하는 경우도 한 번에 처리한다.

③의 공백의 경우는 문자열 자체에서 각 문자를 치환하는 방법을 택해 공백은 건들지 않도록 하여 반환한다.

 

위와 같은 방법으로 시저암호를 구현할 수 있었다.

채점 또한 무리없이 통과할 수 있었다.

댓글