Code KATA/알고리즘 코드카타

[2025.01.15] 시저 암호

iiblueblue 2025. 1. 15. 09:49

문제 설명

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

 

 

제한사항

  • 공백은 아무리 밀어도 공백입니다.
  • s는 알파벳 소문자 ,대문자, 공백으로만 이루어져 있습니다.
  • s의 길이는 8000이하입니다.
  • n은 1이상, 25이하인 자연수입니다.

 

 

입출력 예

s n result
"AB" 1 "BC:"
"z" 1 "a"
"a B z" 4 "e F d"

 

 

문제 풀이

풀이 언어 : C++

#include <string>
#include <vector>

using namespace std;

string solution(string s, int n) {
    string answer = "";
    for(int i=0; i<s.length(); i++)
    {
        char character;
        
        if(s[i]>='a'&&s[i]<='z'&&s[i]+n>'z') // 소문자이고 s[i]+n이 'z'를 넘어섰을 때
        {            
            character=(s[i]+n)-'z'+'a'-1;
        }
        else if(s[i]>='A'&&s[i]<='Z'&&s[i]+n>'Z') // 대문자이고 s[i]+n이 'Z'를 넘어섰을 때
        {
            character=(s[i]+n)-'Z'+'A'-1;
        }
        else if(s[i]==' ') // 공백일 때
        {
            character=' ';
        }
        else // 그 외
        {
            character=(s[i]+n);
        }
                
        answer+=character; // 문자 추가
    }
    return answer;
}

반복문을 돌면서 모든 s를 구성한는 문자를 돌며 맞는 조치를 취해주면 된다. 우선 s[i]가 어떤 문자인지부터 파악해야 한다.

 

먼저 소문자이면서 n을 더했을 때 'z'를 넘어섰을 경우이다. 'z'를 넘어갔을 때는 다시 'a'로 돌아가 카운트하게 된다. 그래서 s[i]+n에 'z'를 빼고 'a'를 더한 후 -1을 해주었다. 이렇게하면 만약 'z'+1일 경우 'a'가 반환되게 된다.

다음으로 대문자이고 n을 더했을 때 'Z'를 넘어섰을 경우이다. 마찬가지로 넘어갔을 때 다시 돌아 'A'에서 카운트해야하기 때문에 위와 같은 방법으로 처리한다.

다음으로 공백인 경우이다. 제한 조건에 공백은 아무리 밀어도 공백이기 때문에 공백은 따로 처리해주어야 한다. 공백이라면 그대로 공백을 character에 저장한다.

마지막으로 그 외의 모든 평범한 경우들은 s[i]+n을 character에 저장한다.

 

이렇게 모든 조건을 확인하고 나면 character를 answer에 추가하여 정답을 완성해나간다.

 

참고 사항

문자도 사칙연산이 가능하며 비교연산도 가능한다. 문자에 자연수를 더하면 문자의 아스키코드 번호에 숫자가 더해지게 된다.

 

 

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/12926

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr