[JAVA] 프로그래머스 (Lv.1) 시저 암호

AIR·2023년 8월 17일
0

링크

https://school.programmers.co.kr/learn/courses/30/lessons/12926


문제 설명

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "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) {
    	//입력된 문자열을 char 배열로 변환
        char[] chars = s.toCharArray();
		
        //배열의 각 원소에 대해 for문을 돌린다
        //원소가 공백일 경우 continue
        //문자를 int형으로 변환하여 아스키 코드를 이용
        //암호화는 대문자, 소문자끼리만 진행되므로
        //아스키코드 범위를 if문으로 구분
        for (int i = 0; i < chars.length; i++) {
            if (chars[i] == ' ') { continue; }
            int num = (int) chars[i];

            if (65 <= num & num <= 90) {
                num += n;
                if (num > 90) {
                    num += 65 - 91;
                }
            } else if (97 <= num & num <= 122) {
                num += n;
                if (num > 122) {
                    num += 97 - 123;
                }
            }
            chars[i] = (char) num;
        }
        return String.valueOf(chars);
    }
}

대소문자 아스키 코드


다른 사람의 풀이

class Solution {
    public String solution(String s, int n) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
>            
            if (Character.isLowerCase(ch)) {
                ch = (char) ((ch - 'a' + n) % 26 + 'a');
            } else if (Character.isUpperCase(ch)) {
                ch = (char) ((ch - 'A' + n) % 26 + 'A');
            }
            sb.append(ch);
        }
        return sb.toString();
    }
}

정리

처음 풀어볼때는 아스키 코드에 대해 익숙치 않아서
우선 각 문자들을 아스키 코드, int형으로 변환시킨 뒤
n을 더하고 또 if문으로 대소문자 범위가 겹치지 않도록 조건을 정하고..
억지억지로 테스트는 통과되었지만

다른 사람의 풀이도 보고 찾아본 결과
char은 문자 타입으로 분리되어 있지만, 사실상 2바이트의 정수였다.
char 변수에 문자를 할당하고 출력할때는 그대로 문자가 출력되지만
컴퓨터에 저장될때는 아스키 코드값으로 치환되는 것이다. (그래서 내가 처음에 한 (int)를 사용해 정수로 변환할 때도 아스키 코드로 변환 되는것)
그래서 char형에서 문자끼리의 덧셈이 가능한 것이고 그 값은 int형으로 변환된다.

				//아스키 코드 값
char c1 = 'A';  //65 
char c2 = 'B';  //66
System.out.println(c1 + c2);  //출력값은 131
System.out.println(c1 + 1);  //출력값은 66

참고

https://kang-james.tistory.com/entry/JAVA-%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0-%EB%AC%B8%EC%9E%90-%ED%83%80%EC%9E%85-char-%EC%99%80-%EB%AC%B8%EC%9E%90%EC%97%B4-String-%EC%9D%98-%EC%A7%84%EC%8B%A4

profile
백엔드

0개의 댓글