프로그래머스/Lv. 1

[프로그래머스 코딩테스트] 시저 암호(Java)

Sigfriede 2023. 6. 11. 01:00

  문제 설명

  어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "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"
import java.lang.StringBuilder;
class Solution {
    public String solution(String s, int n) {
        StringBuilder sb = new StringBuilder(s);
        for (int i = 0; i < s.length(); i++) {
            if (Character.isUpperCase(sb.charAt(i))) {
                sb.setCharAt(i, (char)(sb.charAt(i) + n));
                if (sb.charAt(i) > 'Z') {
                    sb.setCharAt(i, (char)(sb.charAt(i) - ('Z' - 'A' + 1)));
                }
            } else if (Character.isLowerCase(sb.charAt(i))) {
                sb.setCharAt(i, (char)(sb.charAt(i) + n));
                if (sb.charAt(i) > 'z') {
                    sb.setCharAt(i, (char)(sb.charAt(i) - ('z' - 'a' + 1)));
                }
            }
        }
        String answer = sb.toString();
        return answer;
    }
}

  StringBuilder를 생성합니다. 인자에 문자열 s를 받습니다. 알파벳만 변경하고 공백은 처리하지 않을 것입니다.

  for문이 s의 길이만큼 순회합니다.

  바깥 if문에서 Character 클래스의 isUpperCase를 이용하여 sb의 i 번째 문자가 대문자인지 확인합니다. 조건을 충족한다면 setCharAt 메소드를 이용하여 i 번째 위치 문자(인덱스)를 i 번째 문자에 n을 더한 값으로 변경해줍니다. 아스키 코드를 이용한 계산이므로 문자형으로의 명시적 캐스팅으로 문자로 출력할 수 있도록 합니다.

  안쪽 if문에서 i 번째 문자가 Z보다 크다면 setCharAt 메소드로 문자를 변경하는 것은 동일하되, Z에서 A를 뺀 값에 1을 더한 값을 i 번째 문자에서 빼는 과정을 거칩니다. 알파벳 + n이 아스키코드의 알파벳의 범위를 벗어날 수 있기 때문입니다.

  소문자 역시 대문자를 다루는 과정과 완벽히 동일합니다.

  StringBuilder를 이용했으므로 반환하기 전 문자열로 올바르게 출력될 수 있도록 toString 메소드를 이용합니다. 이를 answer에 할당하고 반환합니다.