[Java] 시저 암호 (programmers)

Haeun Noh·2023년 5월 10일
0

programmers

목록 보기
41/64
post-thumbnail

0510


문제 설명

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


제한 조건

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

입출력 예

snresult
"AB"1"BC"
"z" 1"a"
"a B z"4"e F d"


풀이 방식

이 문제는 주어진 문자열의 각 문자를 n만큼 뒤로 밀어 값을 구하는 문제입니다.

주어진 문자열에서 charAt을 이용하여 문자열에서 문자를 추출하여 아스키코드값에 n을 더해주면 됩니다.

하지만 이것에는 예외사항이 두 가지 존재합니다.

  1. 문자가 공백인 경우
    이 경우에는 답인 문자열에 공백을 더해준 뒤 continue를 통해 다음 문자로 넘어가줍니다.

  2. n을 더했을 때, 문자가 a~z 또는 A~Z의 범위를 넘어간 경우
    이 경우에는 for문을 통해 문자에 1~n까지 1씩 더한 뒤 더한 문자가 z또는 Z라면 a또는 A로 변경해줍니다.

이제 코드를 보도록 하겠습니다.


        String answer = "";
        for ( int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);

답을 저장할 answer 문자열을 준비한다.
for문을 통해 s에서 charAt을 이용해 문자를 추출한다.


            if ( ch == ' ') {
                answer += " ";
                continue;
            } 

만약 ch가 공백이라면 answer에 공백을 추가해준 뒤 continue를 통해 뒤의 연산 코드가 실행되지 않고 다음 문자로 넘어갈 수 있게 한다.


            for ( int j = 0; j < n; j++) {
                if ( ch+j == 'z' || ch+j == 'Z') {
                    ch -= 26;
                    continue;
                }
            }
            answer += (char)(ch+n);
        }
        return answer;

이중for문을 사용하여 ch1씩 최종적으로는 n만큼 더합니다.
이 때, 만약 ch+jz또는 Z가 된다면 다음에 j를 더할 경우 a~z A~Z의 범위를 벗어나기 때문에 현재 문자열에서 26을 빼줍니다.

z에서 a가 되기 위해서는 25를 빼야하는데, 왜 26을 빼나요?
답은 for문이 끝나고 n을 더해주기 때문입니다.

만약 n1이고 chz라면 결과는 a가 나와야 하는데 z에서 25를 뺀다면 cha가 되어버리고, for문이 끝난 뒤에 answer += (char)(ch+n);를 실행하게 되면 결과적으로 answer에 저장되는 답은 b가 되게 됩니다.

이렇게 범위를 벗어나는 문자에 26을 빼주고



소스 코드

class Solution {
    public String solution(String s, int n) {
        String answer = "";
        for ( int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if ( ch == ' ') {
                answer += " ";
                continue;
            } 
            for ( int j = 0; j < n; j++) {
                if ( ch+j == 'z' || ch+j == 'Z') {
                    ch -= 26;
                    continue;
                }
            }
            answer += (char)(ch+n);
        }
        return answer;
    }
}


실행 결과



profile
기록의 힘을 믿는 개발자, 노하은입니다!

0개의 댓글