[Programmers] 시저 암호 -JAVA

Lee 🧙🏻‍♂️·2021년 8월 30일
0
post-thumbnail

📄 문제 설명

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

📑 제한 조건

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

📇 입출력 예

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

👨🏻‍💻 내가 작성한 코드

class Solution {
    public String solution(String s, int n) {
        String answer = "";
	    int[] c = new int[s.length()];
	    int ascii = 26 - n; //z + 1 = a가 되려면 26을 빼주면 된다.
	          
	    for(int i = 0; i < s.length(); i++) {
	    	c[i] = (int)s.charAt(i); // 아스키 코드를 숫자로 바꾼 값.
	    	 
	    	if(c[i] + n > 122) { // 소문자
	    		c[i] -=  ascii ;
	    	}else if(c[i] + n > 90){ // 대문자
	    		if(c[i] > 96) {
	    			c[i] += n;
	    		}else {
	    			c[i] -=  ascii;
		    	}
	    	}else if(c[i] == 32) {	//빈칸
	    		c[i] = 32;
	        } else { 
	    		c[i] += n;
	    	}
    	 answer += (char)c[i]; 
	     }
	     return answer;
    }
}

👨🏻‍🏫 코드 풀이

이 문제는 ASCII 코드를 알아야 풀 수 있는 문제이다.

  • 알파벳을 ASCII로 바꾸는 방법은 의외로 간단하다. character값에 (int)만 붙여주면 ASCII코드값이 나온다. 예로 a는 97이고 z는 122이다.
  • (c[i] + n > 122) 의 코드는 z다음은 a로 해주는 코드이다.
    • c[i]가 x이고, n=4일때 c[i] -= ascii를 해보면 b가 return되야 한다. (x의 ascii는 120) c[i] = 120 - 26 + 4가 된다.
  • if((c[i] + n > 90)Z의 ASCII코드는 90이다. 그러므로 90이 넘으면 A부터 다시 시작해야하는데 if(c[i] > 96) 이 코드가 없다면 소문자 a,b,c이런 낮은 수에서 에러가 발생한다.
  • else if(c[i] == 32) 빈칸은 아무리 밀어도 빈칸이기 때문에 빈칸은 = 빈칸으로 해둔다.
  • (char)c[i] 마지막으로 ASCII코드를 다시 character로 바꿔준다.

😭 고생한 부분

else if(c[i] + n > 90){ // 대문자
	if(c[i] > 96) {
	    c[i] += n;
	}else {
	    c[i] -=  ascii;
	}

여기서 if(c[i] > 96) {c[i] += n;} 이 부분을 어떻게 처리를 해야하는지 고민을 많이했다. 근데 막상 코드를 짜보니.. 너무 쉬운걸 고민했던거 같다..ㅜㅜ 그리고 효율도 그다지 좋은거같지 않다..

profile
더 나은 개발자가 되기 위해 기록합세!🧙🏻‍♂️

0개의 댓글