문제 링크 https://programmers.co.kr/learn/courses/30/lessons/12928

문제

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

제한 조건

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

풀이 과정

이 문제는 간단해 보이지만, 생각해야될 것이 하나있다.
바로 char 자료형은 1byte 자료형이며 표현할 수 있는 최대 정수 범위는 127이라는 것이다.

만약 ‘z’ = 122인데 n = 25를 더하면 값은 147이므로 char 자료형의 범위를 벗어나게 된다.
그러므로 대문자처럼 문자형에 바로 n을 더해주면 틀리게 되는 것이다.

해결 방법은 int형을 선언해줘서 연산 결과 값을 저장해주고,
만약 ‘z’를 넘어섰다면 26을 빼주는 방식으로 해결하면 된다.

#include <string>
#include <vector>

using namespace std;

string solution(string s, int n) {
    string answer = "";

    for(int i = 0; i < s.size(); i++){
        if('A' <= s[i] && s[i] <= 'Z'){
            s[i] += n;
            if(s[i] > 'Z') s[i] -= 26;
        }
        else if('a' <= s[i] && s[i] <= 'z'){
            int num = s[i] + n;
            if(num > 'z') num -= 26;
            s[i] = num;
        }
    }
    answer = s;

    return answer;
}

댓글남기기