[알고리즘] 시저 암호 (프로그래머스 코딩테스트 기출문제)

god1hyuk·2022년 7월 19일
1

Algorithm Study

목록 보기
17/21
post-thumbnail
  • 문제 설명
    어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.
  • 제한 조건
  1. 공백은 아무리 밀어도 공백입니다.
  2. s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.
  3. s의 길이는 8000이하입니다.
  4. n은 1 이상, 25이하인 자연수입니다.
  • 입출력 예

나의 풀이

public class Caesar {
    public String solution(String s, int n) {
        String answer = "";
        // 매개변수로 받아 온 s를 쪼개어 strArr 배열에 저장
        String[] strArr = s.split("");

        for (int i = 0; i < strArr.length; i++) {
            // strArr의 요소가 공백이 아닌 경우만 반복문 처리
            if (!strArr[i].equals(" ")) {
                // strArr의 문자열 요소를 char 타입으로 변환하여 저장
                char chr = strArr[i].charAt(0);
                // char 타입으로 변환한 chr을 정수형으로 변환하여 저장(유니코드)
                int unicode = (int)chr;
                // 입력 받은 암호의 유니코드가 대문자인지 소문자 인지 판별하는 표현식 변수로 저장
                Boolean upperCase = (unicode >= 65) && (unicode <= 90);
                Boolean lowerCase = (unicode >= 97) && (unicode <= 122);

                // 입력받의 문자의 unicode가 대문자이면서 unicode와 n(이동할 거리)가 90을 넘거나
                // 입력받의 문자의 unicode가 소문자이면서 unicode와 n(이동할 거리)가 122을 넘으면
                // unicode와 n을 더한 값에서 26을 빼주고 아니라면, unicode에 n을 더함
                // (대문자의 끝('Z'), 소문자의 끝('z')을 넘어가면 다시 처음인 'A', 'a'로
                // 돌아와야 하기 때문)
                unicode = upperCase && (unicode + n) > 90 || lowerCase && (unicode + n) > 122 ?
                        (unicode + n) - 26 : unicode + n;

                // 분기 처리되어 연산 된 unicode를 다시 char타입으로 변환
                chr = (char)unicode;
                // 변환 된 chr을 문자열로 변환하여 strArr의 요소로 다시 저장
                strArr[i] = Character.toString(chr);
            }
        }

        // 각 요소가 문자열의 형태로 변환 된 strArr를 다시 문자열로 이어 붙임
        answer = String.join("", strArr);
        return answer;
    }
}

0개의 댓글