본문 바로가기
코딩테스트 연습

Programmers 시저암호 Level 1

by 동배_ 2021. 9. 1.

문제 설명

https://programmers.co.kr/learn/courses/30/lessons/12926?language=java 

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

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

문제 해석 및 풀이 방법

1. 대문자일때 소문자일 때를 구분한다

2. 그리고 n값만큼의 문자를 민다. 이때 알파벳이 초과되면 다시 처음으로 돌아간다.

3. 공백일때는 아무 조건없이 결과에 추가한다. 이 결과를 반환한다.

 

내가 작성한 소스코드(Java)

class Solution {
    public String solution(String s, int n) {
        String answer = "";
        n = n % 26;
        
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if (Character.isLowerCase(ch)) {
                ch = (char) ((ch - 'a' + n) % 26 + 'a');
            } else if (Character.isUpperCase(ch)) {
                ch = (char) ((ch - 'A' + n) % 26 + 'A');
            }
            answer += ch;
        }
        
        return answer;
    }
}

처음에 n = n % 26을한다 그 이유는 알파벳은 26자 이하이기 때문이다 .

 

for문을통해 s스트링의 크기만큼 1씩 계속 더해주는 반복문을 실행한다.

그리고 글자를 하나씩 따와 소문자인지, 대문자인지 확인 후 시저암호( n의 수만큼 문자를 넘김)를 통해 값을 얻는다

이때 ch - 'a' + n 을하는 이유는 먼저 소문자의 처음 값인 'a'를 뺴주고 ch+n을 더해준 후 % 26 을 하면 아스키코드로 계산하기 때문에 'a'의 값을 포함해버려 이상한 특수기호가 나올 수 있기 때문이다

 

대문자도 동일하게 한 후 공백이면 공백을 추가한다. 

결론 및 고찰

시저암호는 정보보호 시간에 배워서 어떤 개념인지 바로 알았었다. 코딩테스트 문제를 풀때 책에서 본 내용이 나와 신기했다. 문제자체를 이해하는데는 얼마 안걸렸으나 처음에 대문자와 소문자를 구분하지 않고 소문자만 구분했어가지고 실패가 떠 수정을 한다고 고생아닌 고생을 했다. 

 

소요 시간 20

댓글