ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CS50 Week2: Problem Set, Caesar
    Programming/CS50 2023. 7. 5. 02:34

    하버드 CS50 2주차 Problem Set 과제 Caesar 의 풀이 과정을 다룹니다.
    C언어로 Command-line Argument를 배열로 받아, 받은 문자열을 암호화는 문제입니다.

    Intro

    문제 링크에서 자세한 내용을 확인할 수 있습니다.

    Caesar's Cipher 를 통한 암호화 예제

    $ ./caesar 1
    plaintext:  HELLO
    ciphertext: IFMMP

    Detail

    1. command-line argument를 통해 cipher key 값을 받는다. 인자가 여럿이거나 숫자가 아닐 경우 오류 메시지와 함께 1을 반환해야 한다.
    2. 암호화 시 대문자/소문자를 보존해야한다.

    Code

    처음엔 어려워보였는데 막상 시작하니 할만 했다.
    문자를 숫자로 바꿀 때 이전 문제에서 letter - 65 를 했었는데, 알고보니 letter - 'A' 이렇게 문자를 직접 써도 된다.
    코드 읽기에도 더 직관적이다.

    #include <ctype.h>
    #include <stdbool.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "cs50.h"
    
    char rotate(char letter, int key);
    bool has_only_digits(string s);
    
    int main(int argc, string argv[])
    {
        if (argc != 2 || !has_only_digits(argv[1])) 
        {
            printf("Usage: ./caesar key\n");
            return 1;
        }
    
        int key = atoi(argv[1]); 
        string plaintext = get_string("plaintext:  ");
    
        printf("ciphertext: ");
        for (int i = 0, n = strlen(plaintext); i < n; i++)
        {
            printf("%c", rotate(plaintext[i], key));
        }
        printf("\n");
    }
    
    
    char rotate(char letter, int key) 
    {
        if (isupper(letter))
        {
            return (letter - 'A' + key) % 26 + 'A'; 
        }
        else if (islower(letter))
        {
            return (letter - 'a' + key) % 26 + 'a';
        }
        else
        {
            return letter;
        }
    }
    
    bool has_only_digits(string s)
    {
        for (int i = 0, n = strlen(s); i < n; i++)
        {
            if (!isdigit(s[i]))
            {
                return false;
            }
        }
        return true;
    }

    댓글