상세 컨텐츠

본문 제목

프로그래머스 Level 1 - 시저 암호(C++)

학생일기/알고리즘

by jaws99 2019. 9. 27. 16:42

본문

반응형

시저 암호는 "ABCD"라는 문자열이 있을 때, 알파벳을 뒤로 x만큼 밀어버린다.

x가 2라면 "ABCD"는 "CDEF", x가 25라면 "ZABC"로 밀린다.

 

 

다음은 작성한 코드이다.

#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] == ' '){
            answer += ' ';
            continue;
        }
        
        unsigned char temp  = s[i] + n;
        if(temp > 'z') temp -= 26;
        else if(temp > 'Z' && s[i] < 'a') temp -= 26;
        answer += temp;
    }
    return answer;
}

접근 방식은 첫째로 공백만을 위한 처리, 두 번째로 대, 소문자일 경우 처리로 나눴다.

C++도 string의 + 연산이 가능해서 풀기 수월했다.

 

1. unsigned char

 - char의 표현 범위는 -128 ~ 127이다. 'z'에서 25가 더해진다면 122+25 = 147로 char의 범위를 초과한다! 따라서 소문자일 경우 범위를 초과할 문제가 있어서 unsigned로 선언했다.

 

2. 대, 소문자 처리

 - 문제에서 n은 0~25 사이라는 조건이 있다. 'z'가 넘어가면 무조건 소문자를 밀어버린 거다. 대문자는 조금 문제가 있었다. 'Z'를 넘어가면 밀어버린 가능성이 있지만, 소문자 a에서 c로 밀어버려도 이 조건문에 걸리게 된다.

   그래서, &&로 입력값은 'a'보다 작은 대문자여야 한다는 조건을 추가했다.

 

+. 정답이 자꾸 틀릴 때,

 -  프로그래머스는 테스트 케이스를 추가할 수 있다. "a A z Z"로 n 25로 밀면 "z Z y Y"가 나와야 하는데, z가 소문자에서 소문자로 대문자에서 대문자로 잘 밀리는지 확인하자.

반응형

관련글 더보기