쌓고 쌓다

[프로그래머스] 시저 암포 C++ 풀이 본문

알고리즘/프로그래머스

[프로그래머스] 시저 암포 C++ 풀이

승민아 2022. 7. 7. 18:35

https://school.programmers.co.kr/learn/courses/30/lessons/12926?language=cpp# 

 

프로그래머스

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

programmers.co.kr

 

전체 코드

#include <string>
#include <vector>

using namespace std;

string solution(string s, int n) {
    string answer = "";
    for(int i=0;i<s.length();i++)
    {
        
        if(s[i]>='A'&&s[i]<='Z')
        {
            if(s[i]+n>'Z')
                s[i]=('A'-1)+(s[i]+n)%'Z';
            else
                s[i]+=n;
        }
        else if(s[i]>='a'&&s[i]<='z')
        {
            if(s[i]+n>'z')
                s[i]=('a'-1)+(s[i]+n)%'z';
            else
                s[i]+=n;
        }

    }
    answer=s;
    return answer;
}

 

A~Z인 경우에 n을 더했더니 'Z'를 넘어가는 경우,

a~z인 경우에 n을 더했더니 'z'를 넘어가는 경우에 넘어간 만큼 'A' 또는 'a'에서 이동시켜주면 된다.

('A'-1) 는 넘어간 만큼 이동시켜주기 위해 'A'에서 1을 뺀 뒤 넘어가는 걸 구현한 것이다.

'Z'에서 1을 밀어야 하는데 'A'에서 밀어버리면 엉뚱하게 'B'가 나오기 때문이다.

(s[i]+n)%'Z' 는 얼마나 넘어가야 하는지 계산하는 과정이다.

 

위의 코드는 조건에 따라 n이 1이상, 25이하인 자연수에 맞춘 풀이이다.

즉 1바퀴 회전까지 가능한 알고리즘이지

26이상인경우 2바퀴 이상 돌아가야하는 것까지 정답이 도출 가능한것은 아니다.

 

 

 

혹시 아래와 같이 코드를 구현하였다면 오버플로우에 의해서 엉뚱한 답이 나올 것이다.

아스키코드는 10진수로 127까지 표현이 가능하기 때문이다.

 

'z'는 10진수로 122인데 여기에 n을 5만큼 이동하면 127을 표현해 아무 문제가 없지만

-> 127 출력

 

'z'에 n이 6인 경우 128을 표현해야 하는데 오버플로우가 나는 것이다.

-> -128 출력

 

 

그래서  char에 바로 더해서 string에 저장하고 비교하지 않고

아래처럼 더한 것을 잘 형변환하여 오버플로우나지 않게 비교해야 한다.

 

Comments