본문 바로가기
프로그래머스 코딩테스트 문제/Level 1

[프로그래머스] - 시저 암호(C#)

by jyppro 2023. 8. 22.

시저 암호

오늘은 "시저 암호" 문제를 풀어보도록 하겠습니다. 문제를 바로 살펴보겠습니다.

 

문제 설명

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "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"

 

시작 코드

public class Solution {
    public string solution(string s, int n) {
        string answer = "";
        return answer;
    }
}

 

나의 풀이

public class Solution {
    public string solution(string s, int n) {
        string answer = "";
        int lowerMax = (int)'z';
        int upperMax = (int)'Z';
        for(int i = 0; i < s.Length; i++)
        {
            char c = s[i];
            if(c != ' ')
            {
                int ic =(int)c + n;
                if(char.IsUpper(c) && ic > upperMax) || ic > lowerMax) { ic -= 26; }
                c = (char)ic;
            }
            answer += c;
        }
        return answer;
    }
}

 

코드 분석

string 타입 s와 int 타입 n이 주어지며 코드가 시작됩니다. int로 lowerMax와 upperMax를 선언하고, 각각 소문자, 대문자 Z를 int형으로 변환시킨 값을 저장합니다. for문으로 s의 길이만큼 돌리고 그 안에서 char타입으로 선언한 c에 s[i]를 넣어줍니다. 이후 if문에서 c가 공백이 아니라면 int형 ic에 int형으로 바꾼 c에 n을 더한 값을 넣어줍니다. 추가로 if문을 하나 더 작성하여 char.IsUpper(c) 과 ic가 upperMax 보다 크다는 and조건을 괄호로 닫고, or조건으로 ic가 lowerMax보다 크다는 조건까지 걸어줍니다. 만약 성립한다면 ic의 값에 26을 빼주는 계산을 합니다. 이후 c에 char타입으로 변환한 ic를 넣어줍니다.

answer에 c를 전부 추가해주고 반환해줍니다.

 

풀이 설명

시저 암호는 주어진 알파벳을 밀어서 다른 알파벳으로 나타내는 것입니다. 문제에서 요구하는 것도 시저암호를 만드는 것입니다. 제한사항에서 보이듯 대문자, 소문자 알파벳과 공백문자만 포함하고 있습니다. 그렇다면 저희는 시저암호를 만들기 위해 이 세가지 문자를 판별해서 사용해 주어야 합니다.

 

lowerMax, UpperMax는 알파벳의 끝인 z를 소문자, 대문자로 구별해서 저장해 놓은 것입니다. 하지만 보면 int형으로 저장하는데 이렇게 int형으로 변환시켜 주면 아스키 코드로 변환되어 각각 대문자 Z는 90, 소문자 z는 122가 됩니다.

 

이후 계산과정은 단순한데, c가 공백이 아니면 시작되는 if문 안에 있는 또 하나의 if문에서 나타내는 조건은 c가 대문자인지 체크하는 것과, 계산된 ic의 값이 upperMax보다 크다는 조건이 and로 묶여있습니다. 여기서 ic는 주어진 알파벳에서 지정된 위치만큼 이동된 알파벳을 뜻하는데 그것이 90보다 큰 수인지 동시에 체크하는 것입니다. or 조건에서 마찬가지로 소문자 z가 나타내는 122보다 큰지 체크합니다. 만약 범위를 넘어간다면 -26을 해줘서 각 대소문자 알파벳의 첫 시작범위로 돌아가게 만들어 줍니다. Z를 넘어가면 A로, z를 넘어가면 a로 돌려줍니다. c에 다시 만들어진 값 ic를 넣어주고 answer에 순서대로 저장시켜 반환하며 끝이 납니다.

 

<NEXT>

오늘은 "시저 암호" 문제를 풀어보았습니다. 문제 설명만 읽었을 때에는 크게 복잡하지 않을 거라고 생각했지만, 막상 문제를 푸는 방식은 생각했던 것보다 조금 복잡한 감이 있었습니다. 다음에는 2021 카카오 채용연계형 인턴쉽 출제 문제인 "숫자 문자열과 영단어" 문제를 풀어보도록 하겠습니다. 감사합니다.