개발의 흔적

알고리즘 테스트# 13. 시저 암호 본문

코딩테스트 연습

알고리즘 테스트# 13. 시저 암호

남들에게 도움을 주는 백엔드 개발자가 되자 2020. 7. 28. 17:42

안녕하세요.

 

프로그래머스에 있는 "시저 암호" 알고리즘 문제를 풀어보겠습니다.

 

문제 : 어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 AB는 1만큼 밀면 BC가 되고, 3만큼 밀면 DE가 됩니다. z는 1만큼 밀면 a가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.

 

출력 :

 

AB 1 BC
z 1 a
a B z 4 e F d

 

코드 : 

 

 

* 문제 해설 *

 

문자열 : AB , z

 

시저암호는 오른쪽으로 n만큼 이동을 한 결과값이 나와야합니다.

가장 첫번째는 대소문자를 비교하기 위해서는 char로 String값을 잘라서 

char[] 배열안에 넣어야합니다. toChartArray()함수를 사용합니다.

일단 AB는 오른쪽으로 1만큼 옮겼다고 가정했을경우

BC의값이 나와야합니다. 이런 결과가 나오기 위해 문자를 비교를 해야합니다.

 왜냐하면 현재 AB에서 BC로 갈수있는 방법은 없기떄문입니다(개인적인생각)

 처음 문제를 생각할때 이값이 어떻게해야 나올까 생각을 했습니다.

 없는값을 만들어야하나??라는 생각이 들었다가 문자니깐 문자끼리 하나하나씩 잘라서

 비교를 해야하는데 비교대상이 누구지? 라고 생각이들었습니다.

 문자를 비교한다라.............음................충분한 고뇌를 가지고 "아" 이문제는 대문자,소문자의 값이 필요하겠구나

라는 생각을 했습니다. 대문자의 범위는 정수로 어디서부터 어디까지지??라고해서 "A"의 값을 찾아봤습니다.

"A"의값을 확인한결과 65라는 숫자가나왔습니다. 그후 "Z" 90으로 나오고, 소문자 "a" = 97 , 'z' = 122의 값이

나왔습니다. 이제 이값을 비교하여 조건문에서 결과가 있다면 n만큼 값을 더했습니다.

그후 문제 조건중 공백인경우를 처리해야하는데 공백인경우는 0의값으로 처리를하였고

자꾸 테스트 케이스에서 오류가나서 확인을 해보니 'h'의 값이 122의 범위를 넘어가면 특수문자로

처리가 되는걸 알았습니다. 그후 생각했습니다. h의값을 오른쪽으로 3만큼이라고 치면 "k"의값이 나와야하는데

특수문자가나와서 많이 해멨습니다.  그후 n은 1 이상, 25이하인 자연수입니다.라는 제한 조건을 맞춰서 

25의 정수값을 테스트를 해본결과 역시나 정수로도 122의값보다 큰값이 나왔습니다. 

그후 25의값을 뺄샘을 했을경우 넘어가지않고 본래 z의 정수 값이 나왔습니다.

그런데 문제는 z의 값을 25번 이동한다고 치면 x의 값이나옵니다. 정확한 값이나오기위해서는

26을 뺴야합니다. 왜냐하면 z의값을 포함하여 숫자를 찾기떄문입니다. 

초보인 사람으로써는.... 어렵네요..하하

 

 

* 코드 해설 *

 

입력 받은 문자열을 toCharArray()의 함수를 이용하여 문자열을 잘라

문자에 저장합니다. 그후 

 

문자의 길이만큼 반복을 진행합니다. 문제해설에서 본것처럼 

첫번째 분기문에서 소문자의 길이만큼 s1[i]의 값을 구한경우 n만큼 더합니다.

대문자는 : 97 ~ 122의 까지입니다.

그후 122보다 큰 값이 나올수가있습니다. 122보다 값이 큰경우는 

-26을 하여 원하는값을 도출시킵니다.

두번째 분기문 처리를 합니다.

소문자는 : 65 ~ 90의 까지입니다.

마찬가리조 s1[i]의값이 조건문안에있다면 안쪽 로직이 작동이 됩니다.

그후 만약에 90을 넘어가는수가있으면 -26을 하여 원하는값을 도출합니다.

이제 z의 값이 넘어갈경우 65의값이 아닌 64의값을 넣습니다. 

65의값을 넣는다면 a포함에서 b가 나오기떄문입니다.

대문자 Z또한 마찬가지입니다.

 

그후 만약에 공백이 나온다면 0으로 이동을 시키지 말아야합니다.

 

 

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

 

코딩테스트 연습

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr

 

좋은 코드있으면 말씀해주세요.

Comments