will come true

[프로그래머스 / Level1] 시저 암호 (Java) 본문

Algorithm

[프로그래머스 / Level1] 시저 암호 (Java)

haehyun 2021. 10. 29. 17:08
728x90

문제

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

 

코딩테스트 연습 - 시저 암호

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

programmers.co.kr

*시저암호 : 어떤 문장의 각 알파벳을 정해진 거리만큼 일어서 다른 알파벳으로 바꾸는 암호화 방식

 

기존 코드 (성공)

class Solution {
    public String solution(String s, int n) {
        String answer = "";
        String upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        String lower = "abcdefghijklmnopqrstuvwxyz";
        
        String[] strArr = s.split("");
        
        for(int i = 0; i < strArr.length; i++){
            int idx = 0;
            if(upper.contains(strArr[i])){
                idx = upper.indexOf(strArr[i]) + n;
                answer += (idx >= upper.length()) ? upper.charAt(idx - upper.length()) : upper.charAt(idx); 
            }else if(lower.contains(strArr[i])){
                idx = lower.indexOf(strArr[i]) + n;
                answer += (idx >= lower.length()) ? lower.charAt(idx - lower.length()) : lower.charAt(idx);
            }else{
                answer += strArr[i];
            }
        }
        
        return answer;
    }
}

- 미리 대/소문자용 문자열을 선언해두고, String객체의 charAt(int index)메서드를 통해 한 글자씩 가져오는 방식
- 문자열을 미리 선언해둬야 하는 수고로움이 있으며, 대소문자 전환이 프로그래밍적이지 못 하다. 
- 대문자일 경우/ 소문자일 경우 수행되는 코드 블록이 비슷함. (=중복 코드)

 

학습 내용

A. 대·소문자 여부 판단

Character 클래스의 static 메소드 사용

메서드 설명
boolean isAlphabetic(int codePoint) 주어진 문자가 알파벳인지 체크
boolean isUpperCase(char ch) 주어진 문자가 대문자인지 체크
boolean isLowerCase(char ch) 주어진 문자가 소문자인지 체크

 

public class CharCaseTest {
	public static void main(String[] args) {
		char ch = 'A';
				
		System.out.println(Character.isAlphabetic(ch));		//true
		System.out.println(Character.isUpperCase(ch));		//true
		System.out.println(Character.isLowerCase(ch));		//false
		
		ch = 'a';
		System.out.println(Character.isAlphabetic(ch));		//true
		System.out.println(Character.isUpperCase(ch));		//false
		System.out.println(Character.isLowerCase(ch));		//true
	}
}

 

B. 대표적인 대·소문자 전환 방법

  1. String 인스턴스 메서드 toUpperCase(), toLowerCase() 사용
  2. Char 타입 변수에 +32, -32 연산 수행 (아래 ASCII 코드표 A~Z, a~z 값 참고)

ASCII Code, 출처 : https://naveenr.net/unicode-character-set-and-utf-8-utf-16-utf-32-encoding/

 

C. Char타입 문자에서 알파벳 순번 얻기

코드표에서 A~Z, a~z 알파벳은 순차적으로 코드가 정해져있다. A(65), B(66), C(67),.... Z(91)
이런 순차성 덕분에 특정 알파벳 문자에서 -'A'(-65)또는 -'a'(-97)을 하면 해당 문자의 순번을 알 수 있다.
ex) 'C' - 'A' = 67 - 65 = 2
     'Z' - 'A' = 91 - 65 = 26
문자가 char타입 정수일 때도 -'0'(-48)을 해서 int타입 정수로 변환한 수 있다.
ex) '5'-'0' = 53 - 48 = 5

 

개선 코드 (성공)

public String solution(String s, int n) {
	String answer = "";
    n = n % 26;                     //n이 26(알파벳 개수)를 넘을 경우 대비
    char[] chArr = s.toCharArray();
    
    for(char ch : chArr){
        if(Character.isUpperCase(ch)){
            ch = (char)(((ch - 'A' + n) % 26) + 'A');	//ch+n 값이 26을 넘을 경우 대비 (대/소문자 구간 벗어나지 않게)
        }else if(Character.isLowerCase(ch)){
            ch = (char)(((ch - 'a' + n) % 26) + 'a'); 
        }
        
        answer += ch;
    }
    
    return answer;
}
728x90
Comments