JAVA/Argorithm Test

# Level 1 - 시저 암호

skysoo1111 2020. 11. 23. 13:38

[문제]

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 AB는 1만큼 밀면 BC가 되고, 3만큼 밀면 DE가 됩니다.

 

z는 1만큼 밀면 a가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.

 

 

[다른 사람 풀이 참고]

나는 처음에 이 문제를 아스키 코드 값을 통해서 풀려고 접근했었다.

a = 97 / z = 122

A = 65 / Z = 90

 

그런데 코드 제출 과정에서 몇 개의 fail이 계속 생기는 것이다.. 아무리 코드를 봐도 어디서 fail 됐는지 알 방도가 없었기에 다른 사람 풀이를 참조했는데, 어쨌든 이 풀이가 더 효과적이었기에 내 코드가 통과 했더라도 크게 의미가 있을것 같진 않다...

 

가운데 c = (char) (start + (c + n - start)%26); 코드가 중요한데,

 

  • c는 현재 문자열의 아스키 값
  • n은 밀어야 할 수
  • start는 (대/소문자의 값 65 or 97) 아스키 값

이 코드를 통해 알파벳이 아닌(!, {, } 등) 아스키 코드 값을 제외한다.

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