본문 바로가기
프로그래머스/level1

[Java][프로그래머스] 시저암호

by wave_m 2020. 10. 22.
728x90

문제 설명 : 

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

 

 

제한 조건 : 

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

 

입출력 예 : 

s n result
"AB" 1 "BC"
"z" 1 "a"
"a B z" 4 "e F d"

 

class Solution {
    public String solution(String s, int n) {
        String answer = "";

	for (int i = 0; i < s.length(); i++) {
		char ch = s.charAt(i);

		if (Character.isLowerCase(ch)) {
			ch = (char) ((ch + n % 26 - 'a') % 26 + 'a');
		} else if (Character.isUpperCase(ch)) {
			ch = (char) ((ch + n % 26 - 'A') % 26 + 'A');
		}
		answer += ch;
	}
	return answer;
    }
}

 

 

알고리즘 풀이 : 

1. String으로 반환할 answer를 ""로 초기화하여 선언

2. for문을 s의 길이만큼 반복

3. charAt을 사용하여 i번째 문자를 출력하여 char 타입의 ch에 저장

4. 문자 ch가 대문자인지 소문자인지 판별하고 n 이후의 문자를 ch에 저장

1) ch가 소문자이면 Character.isLowerCase(ch)

- n%26을 쓴 이유는 26보다 커지면 알파벳의 주기(a~z)를 넘기에 26보다 항상 작은 수를 만들어야 함

2) ch가 대문자이면 Character.isUpperCase(ch)

5. answer에 ch의 문자를 붙여줌

6. return 을 사용하여 answer을 반환

 

 

charAt(), Character.isLowerCase(), Character.isUpperCase() ? 

- charAt() : 괄호 안에 들어가는 인덱스의 문자를 추출하는 메소드

- Character.isLowerCase() : 소문자를 구분하는 메소드

- Character.isUpperCase() : 대문자를 구분하는 메소드

 

 

 

 

 

728x90