728x90
반응형

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

 

코딩테스트 연습 - 시저 암호

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 AB는 1만큼 밀면 BC가 되고, 3만큼 밀면 DE가 됩니다. z는 1만큼 밀면 a가

programmers.co.kr

[문제 설명]

 

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

 

[제한 조건]

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

입출력 예

s n result
"AB" 1 "BC"
"z" 1 "a"
"a B z" 4 "e F d"

 

[풀이 과정] : [풀이 1] -> [풀이 2]

 

[풀이 1] : 테스트 6,7,8,10,12 오류

 

먼저 string s에서 하나씩 체크해 준다. 만약 s에서 빈칸이면 빈칸을 반환해 준다. 빈칸이 아닐 경우, string 타입을 int로 바꾸어서 n을 더해준다. 

 

#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+=' ';
        else{
            int temp=s[i]-0;
            temp+=n;
            if(temp>90&&temp<97) {temp= temp-26;}
            else if(temp>122) {temp = temp-26;}
            char ch = temp;
            answer += ch;
        }
    }
    return answer;
}

1. string을 int로 바꾸는 방법은 여러 가지가 있지만, 여기서는 s[i]-0을 int 변수에 대입했다.

2. temp변수에 n을 더하고 n을 더한 temp 값이 알파벳 소문자인 a~z 와 대문자인 A~Z를 초과했을 경우 다시 돌아갈 수 있게 차이인 26을 빼서 temp 값에 다시 저장하였다. (26은 아스키 값에서 z-a+1이다.)

3. temp값을 char형의 ch변수에 저장하고 answer에 ch를 저장하였다.

 

//아스키 코드 표 참고//

 

[풀이 2] 

[풀이 1]은 n의 개수가 너무 커져서 알파벳 소문자들과 대문자들의 차이를 정확히 구별하기 힘들다고 생각했다.

예를 들면 input 값이 z일때 n이 20이면 아스키 코드 값은 110이 된다. 그러나 소문자로 변환해 주어야 되는데 해당하는 조건이 없으므로 output값이 오류가 날 수 있을 것이라고 생각했다. 그래서 [풀이 2]는 이러한 케이스 들을 다시 처리해주었다.

<내가 직접 더해준 케이스들>

s n result
"AB" 1 "BC"
"z" 1 "a"
"Z" 10 "J"
"a B z" 4 "e F d"
"aBZ" 20 "uVT"

s[i]를 int로 바꾸어서 저장한 temp값을 소문자 대문자로 조건을 먼저 분류한 뒤, [풀이 1]의 방법을 사용하였다.

#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+=' ';
        else{
            int temp = s[i]-0;
            if(temp>=65&&temp<=90){
                temp+=n;
                if(temp>90) temp-=26;
            }
            else if(temp>=97&&temp<=122){
                temp+=n;
                if(temp>122) temp-=26;
            }
            char ch = temp;
            answer+=ch;
        }
    }
    return answer;
}

 

728x90
반응형

+ Recent posts