시저암호_Java

컴투루·2022년 6월 23일
0

프로그래머스 Lv.1

목록 보기
14/38

연습문제

🔥 시저암호 🔥


👀 문제

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방법을 시저암호라고 한다.
문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수 solution을 완성해보자.


✔️ 조건

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

👩‍💻 입력 & 🧙 출력

s n result
"z" 1 "a"
"a B z" 4 "e F d"
- 내가 추가한 테스트케이스 -
"Z" 1 "A"
"P" 15 "E"
"P" 20 "J"

🙋‍♀️ 풀이

class Solution {
    public String solution(String s, int n) {
        String answer = "";
        
        char[] c = s.toCharArray();  
        int[] d = new int[c.length];
       
        for(int i=0;i<c.length;i++){   
             d[i] = (int)c[i]+n;  
            
            if(d[i]-n == 32){//공백이라면
               answer+= " "; 
            }else if(90<d[i] && 64<d[i]-n && d[i]-n < 91){
                answer += (char)(65+d[i]-91); 
            }else if(d[i]>122){
                answer += (char)(97+d[i]-123);
            }
            else{
                answer += (char)(d[i]);    
            }
        }
        return answer;
    }
}

문제를 보자마자 이건아스키코드다! 라고 생각은 했지만 내가 외우고 다니지는 않기에 바로 아스키코드부터 검색했다.

  1. 자료형이 char인 배열 c에 문자열 s를 toCharArray() 를 통해 대입
  2. 배열 c의 길이만큼 반복하면서 c[i]번째 문자를 아스키코드로 변경하면서 n을 더해준 값을 d[i]에 대입

이제부터는 조건에 따라서 answer에 더하는 방식이다.

  • 아스키코드의 값이 공백이라면 answer에 " "를 더해준다.

  • d[i]의 값이 90보다 크다는 것은 대문자 Z보다 큰 값이라는 것이다. 대입된 문자가 대문자인데 n을 더한 문자가 Z보다 뒤에있는 문자라면 answer에 (65+d[i]-91)의 값을 더해주는 것이다.

  • 그리고 d[i]>122는 아스키코드가 소문자 z보다 커지는 경우로 answer에 (97+d[i]-123)을 더해준다.

풀기는 했지만 비효율적이고 지저분한 코드라는 것은 알 수 있었다.


💬 다른 풀이

class Solution {
        public String solution(String s, int n) {
            String answer = "";
            for(char ch : s.toCharArray()) {
                if(ch==' ') {
                    answer += ch;
                }else if(ch>='a'&& ch<='z'){
                    answer += (char)('a' + (ch+n-'a')%26);
                }else {
                    answer += (char)('A' + (ch+n-'A')%26);
                }
            }
            return answer;
        }
    }

와우... 불필요한 변수도 알아보기 힘든 조건도 없는 너무 깔끔 코드 ✨

  • 공백이라면 answer에 바로 더해준다.

  • ch의 값이 a~z 라면

 answer += (char)('a' + (ch+n-'a')%26);
  • ch의 값이 A ~ Z 라면
 answer += (char)('A' + (ch+n-'A')%26);

👏 마무리

저런 생각을 왜 못할까

profile
맘 먹으면 못할 게 없지

0개의 댓글