[해커랭크] Caesar Cipher

Kim Yuhyeon·2023년 10월 20일
0

알고리즘 + 자료구조

목록 보기
146/161

문제

https://www.hackerrank.com/challenges/one-week-preparation-kit-caesar-cipher-1/problem?isFullScreen=true&h_l=interview&playlist_slugs%5B%5D=preparation-kits&playlist_slugs%5B%5D=one-week-preparation-kit&playlist_slugs%5B%5D=one-week-day-three

접근 방법

  1. 알파벳은 26개이므로 k의 값을 26으로 나눈 나머지로 초기화한다.
  2. string의 각 문자를 돌면서 대문자와 소문자를 구별한다.
  3. k만큼 뒤로 민 인덱스가 'z', 'Z' 보다 클 경우 26을 빼주어서 알파벳 범위 내에 있도록 유지한다.
ex. k = 3
x (120) 의 경우 
x+k = 123 이므로 
z(122) 를 넘는다. 
알파벳 개수인 26을 빼주면 a(97)이 된다.

풀이

나의 풀이

string caesarCipher(string s, int k) {
    
    k = k % 26;
        
    for(int i=0; i<s.length(); i++)
    {        
        if (s[i] >= 'a' && s[i] <= 'z')
        {
            if ((int)'z' < (int)(s[i] + k))
                s[i] += k - 26;
            else
                s[i] += k;
        }
        else if (s[i] >= 'A' && s[i] <= 'Z')
        {
            if ((int)'Z' < (int)(s[i] + k))
                s[i] += k - 26;
            else
                s[i] += k;
        }
    }
    
    return s;
}

출제자의 풀이

#include <iostream>
#include <string>

using namespace std;

int main() {
    int n;
    string s;
    cin >> n;
    cin >> s;
    int k;
    cin >> k;

    k %= 26;
    for (int i = 0;i < n; i++) {
        int c = s[i];
        if (c >= 'a' && c <= 'z') { // Lowercase characters
            c += k;
            if (c > 'z') { // C exceeds the ascii range of lowercase characters.
               c = 96 + (c % 122); // wrapping from z to a
            }
        } else if(c >= 'A' && c <= 'Z') { // Uppercase characters
            c += k;
            if(c > 'Z') { // C exceeds the ascii range of uppercase characters.
                c = 64 + (c % 90); //wrapping from Z to A
            }
        }
        cout << (char)c;
    }
    cout << endl;
    return 0;
}

A새로 구한 문자를 Z로 나눈 나머지를 더해서 감쌌다.

참고

https://donrang.tistory.com/74

0개의 댓글