개발하는 고양이 오이

25. [JAVA] 프로그래머스 코딩테스트 연습 Level.1 - 시저 암호 / 9번 빼고 실패 해결 / 다른 사람의 풀이 본문

코딩테스트 - JAVA/프로그래머스 Programmers

25. [JAVA] 프로그래머스 코딩테스트 연습 Level.1 - 시저 암호 / 9번 빼고 실패 해결 / 다른 사람의 풀이

Cucum 2022. 5. 9. 10:36

https://programmers.co.kr/learn/challenges

 

코딩테스트 연습

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr

 

프로그래머스 코딩테스트 연습 Level.1 - 시저 암호



풀이

import java.util.*;

class Solution {
    public String solution(String s, int n) {        
        int chNum;
        int changeNum;
        char[] charArray = new char[s.length()];
        
        for (int i = 0; i < s.length(); i++) {
            chNum = (byte)s.charAt(i);               // String을 char로 변환 후 char를 int(아스키코드)로 변환
            
            if (chNum == 32) {             // 아스키코드가 32 = 공백
                changeNum = chNum;
            }
            else {
               if (chNum >= 90 && chNum < 96) {          // 대문자 판별 = 대문자의 아스키코드가 90을 넘어가면(즉 Z이면) -26
                    chNum = chNum - 26; 
                }

                if (chNum >= 122) {                     // 소문자 판별 = 소문자의 아스키코드가 122을 넘어가면(즉 z이면) -26
                    chNum = chNum - 26;
                }
                changeNum = chNum + n;   
            }
            
            if (changeNum > 90 && chNum < 96) {         // n만큼 더한 값이 대문자 마지막 아스키코드 값인 90을 넘어가면 -26
                changeNum = changeNum - 26;
            }   
            if (changeNum > 122) {                      // n만큼 더한 값이 소문자 마지막 아스키코드 값인 122을 넘어가면 -26
                changeNum = changeNum - 26;
            }

            charArray[i] = (char)changeNum;             // char형 배열에 넣어주기
        }
        return new String(charArray);                   // char형 배열을 String을 바꿔서 return
    }
}

 

풀이 과정

① String을 Char로 변환 (charAt(index))

② Char을 아스키코드(숫자)로 변환 (byte(char변수))

③ n값을 + 해주기

④ +해준 int값을 Char형 배열에 넣은 후 String으로 바꿔서 return

 


(풀이 실패 과정)

import java.util.*;

class Solution {
    public String solution(String s, int n) {
        String answer = "";
        
        char ch;
        int chNum;
        int changeNum;
        char[] charArray = new char[s.length()];
        
        for (int i = 0; i < s.length(); i++) {
            ch = s.charAt(i);               // String을 char로 변환
            chNum = (byte)ch;               // char를 int(아스키코드)로 변환
                      
            if (chNum == 32) {             // 아스키코드가 32 = 공백
                changeNum = chNum;
            }
            else {
               if (chNum >= 90 && chNum < 96) {          // 대문자 판별
                    chNum = chNum - 26; 
                }

                if (chNum >= 122) {          // 소문자 판별
                    chNum = chNum - 26;
                }
                changeNum = chNum + n;   
            }
           charArray[i] = (char)changeNum;
        }
        answer = new String(charArray);
        return answer;
    }
}

실패 이유

= 예를 들어 s가 "P"이고, n이 15일 때 return값은 E이어야 하는데, 위의 코드는 "_"를 출력함. 코드를 살펴보니 n값을 더한 아스키코드가 대문자일때 90(Z)을 넘어가버리기 때문.


다른 사람의 풀이

- Character.isLowerCase()

   = 입력 받은 인자가 영문 소문자 인지 여부를 판단하여 true 또는 false 값을 return.

 

- Character.isUpperCase()

   = 입력 받은 인자가 영문 대문자 인지 여부를 판단하여 true 또는 false 값을 return.