알고리즘/프로그래머스 1단계

프로그래머스 - 시저 암호 - C++

게임만드는학생 2023. 10. 18. 16:58

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

#include <string>
#include <vector>

using namespace std;

string solution(string s, int n) {
    
    for(int i=0;i<s.length();i++)
    {
        if(s[i]!=' ')
        {
            int al = (int)s[i];
            // 소문자이면
            if(al >= 97)
            {
                al = (al - 97 + n) % 26;
                s[i] = 'a'+al;
            }
            else
            {
                al = (al - 65 + n) % 26;
                s[i] = 'A' + al;
            }
        }
    }
    return s;
}

 

설명

이 문제는 문자열에 있는 알파벳에서 사전적으로 n만큼 뒤에 있는 알파벳으로 바꾼 알파벳을 만드는 것이다. 

 

 따라서  for문을 통해 공백이 아닌 문자일 때, 소문자인가 대문자인가에 따라 연산을 해준다. 

 

int al = (int)s[i];

 이 코드는 알파벳을 정수형으로 표현하겠다는 뜻이다. 즉 아스키코드로 바뀌는 것이다.

 

그리고 이 al이 97 이상이면 소문자라는 뜻이다. 

 

al = (al - 97 + n) % 26;
s[i] = 'a'+al;

위 코드는 al-97을 통해 몇번째 알파벳인지를 파악하고 +n을 함으로써 원하는 결과의 알파벳의 순서를 파악한다. 

그리고 알파벳의 개수인 26을 나머지연산하여 z를 넘어가면 다시 a로 오게끔 해준다. 

 

그리고 몇번째인지를 파악했으니 소문자 a에 +al을하여 a에서 원하는 만큼 이동시켜준다. 

 

al = (al - 65 + n) % 26;
s[i] = 'A' + al;

대문자도 동일한 연산을 거치는데 대문자 'A' 는 아스키코드가 65이므로 65를 뺀다.