시저 암호는 "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의 + 연산이 가능해서 풀기 수월했다.
- char의 표현 범위는 -128 ~ 127이다. 'z'에서 25가 더해진다면 122+25 = 147로 char의 범위를 초과한다! 따라서 소문자일 경우 범위를 초과할 문제가 있어서 unsigned로 선언했다.
- 문제에서 n은 0~25 사이라는 조건이 있다. 'z'가 넘어가면 무조건 소문자를 밀어버린 거다. 대문자는 조금 문제가 있었다. 'Z'를 넘어가면 밀어버린 가능성이 있지만, 소문자 a에서 c로 밀어버려도 이 조건문에 걸리게 된다.
그래서, &&로 입력값은 'a'보다 작은 대문자여야 한다는 조건을 추가했다.
- 프로그래머스는 테스트 케이스를 추가할 수 있다. "a A z Z"로 n 25로 밀면 "z Z y Y"가 나와야 하는데, z가 소문자에서 소문자로 대문자에서 대문자로 잘 밀리는지 확인하자.
[2020카카오공채] 문자열 압축(C++) (0) | 2019.11.13 |
---|---|
프로그래머스 Level 2 - 쇠막대기(C++) (0) | 2019.10.12 |
프로그래머스 Level 2 - 탑(C++) (0) | 2019.10.12 |
프로그래머스 Level 1 - 같은 숫자는 싫어(C++) (0) | 2019.10.07 |
프로그래머스 Level 1 - 가운데 글자 가져오기(C++) (0) | 2019.09.29 |