알고리즘 풀이/프로그래머스

[Level1] 시저 암호

mhko411 2021. 1. 21. 21:46
728x90

문제

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 한다. 

문자열 s와 거리 n이 입력되었을 때 시저 암호를 출력하는 함수를 만들어보자

공백은 밀어도 그대로 공백이며 입력되는 s는 소문자, 대문자, 공백으로만 이루어져있다.

거리 n은 1이상 25이하의 자연수이다.

 

입력

"a B z" 4

 

출력

"e F d"


처음에 거리가 25도 입력될 수 있다는 것을 고려하지 않았다. 그래서 'Z'에서 n을 더한 값이 90초과 97미만일 때만 'A'부터 시작하도록 했다. 만약 'Z'에서 25를 더하면 115가 되었는데 이 부분은 소문자 알파벳이 출력되었다. 따라서 소문자, 대문자에 따라 다르게 계산을 하여 출력하도록 하였다.

 

1. 문자열의 인덱스를 탐색하여 공백일 때는 그대로 공백을 더한다.

2. 이후 문자를 ord()를 통해 숫자로 바꾼 값에 따라 소문자와 대문자인 경우로 나눈다.

3. 소문자일 때(97~122)는 거리만큼 더한 값이 122를 초과하면 #1의 식으로 계산한다.

4. 대문자일 때(65~90)는 거리만큼 더한 값이 90을 초과하면 #2의 식으로 계산한다.

5. 최종적으로 시저암호를 출력한다.

 

※ 'a' ~ 'z' = 97 ~ 122

'A' ~ 'Z' = 65 ~ 90

 

python

def solution(s, n):
    answer = ''
    for idx in range(len(s)):
        if s[idx]==' ':
            answer+=' '
        else:
            num=ord(s[idx])
            if num>=97 and num<=122:
                num+=n
                if num>122:
                    num=(num-123)+97 #1
            elif num>=65 and num<=90:
                num+=n
                if num>90:
                    num=(num-91)+65 #2
            answer+=chr(num)
                
            
    return answer

 

c++

#include <string>
#include <vector>

using namespace std;

string solution(string s, int n) {
    string answer = "";
    int len=s.length();
    for(int i=0;i<len;i++){
        if(s[i]==' ')
            answer+=' ';
        else{
            int num;
            if(s[i]>='a'&&s[i]<='z'){
                num=int(s[i])+n;
                if(num>122)
                    num=(num-123)+97;
            }
            else if(s[i]>='A'&&s[i]<='Z'){
                num=int(s[i])+n;
                if(num>90){
                    num=(num-91)+65;
                }
            }
            answer+=char(num);
        }
    }
    return answer;
}