[Java] 프로그래머스(level1) - 시저 암호

Input-1
“AB”
Output-1
“BC”
Input-2
“a B z”
Output-2
“b C a”
문제 풀이
주어진 문자열에서 대소문자 알파벳을 하나씩 앞으로 밀어낸 알파벳을 찾아야 한다.
먼저 아래의 조건을 검증해보자.
- 주어진 문자열 중에서 공백값은 밀어내지 않고 그대로 담는다.
- 주어진 문자열 중에서 대소문자를 구분한다. // ascii code의 경우 65~90이 대문자, 97~122가 소문자
- 대문자 ‘Z’나 소문자 ‘z’의 범위를 초과했을 경우 ‘A’, ‘a’부터 n만큼 밀어낸다.
공백값일 경우는 밀어낼 필요가 없기에 그대로 담는다.
1
2
3
4
answer = "";
if((char)asc != ' ') {
// 생략
}else answer += ' ';
대소문자를 구분할 boolean 변수를 생성하여 소문자일 경우에만 false로 변경하자.
반복문을 한바퀴씩 순회할 때마다 다시 true로 변경하여 다시 검증할 수 있도록 작성하였다.
1
2
3
4
5
boolean alph = true;
for(int i=0; i<s.length(); i++) {
if('z' >= (char)asc && (char)asc >= 'a') alph = false;
alph = true;
}
대문자 ‘Z’의 범위(asc > 122)를 초과했을 경우 ‘A’로 돌아가서 n만큼 밀어내고
소문자 ‘z’의 범위(asc > 90)를 초과했을 경우 ‘a’로 돌아가서 n만큼 밀어내면 된다.
초과하지 않았을 경우는 그냥 n만큼 밀어낸 알파벳을 담으면 된다.
1
2
3
4
5
if((char)asc != ' ') {
if(alph == true && (asc+n) > 90) answer += (char)(asc - 91 + n + 65); // 대문자 Z 넘어갈 경우
else if(alph == false && (asc+n) > 122) answer += (char)(asc - 123 + n + 97); // 소문자 z 넘어갈 경우
else answer += (char)(asc + n);
}
작성코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.util.*;
class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
int n = sc.nextInt();
solution(s, n);
}
public static String solution(String s, int n) {
int asc = 0;
String answer = "";
boolean alph = true;
for(int i=0; i<s.length(); i++) {
asc = (int)(s.charAt(i));
if('z' >= (char)asc && (char)asc >= 'a') alph = false;
if((char)asc != ' ') {
if(alph == true && (asc+n) > 90) answer += (char)(asc - 91 + n + 65);
else if(alph == false && (asc+n) > 122) answer += (char)(asc - 123 + n + 97);
else answer += (char)(asc + n);
}
else answer += ' ';
alph = true;
}
return answer;
}
}
회고
- char형 변환을 다루어 ascii code 로 변환하여 정수형으로 알파벳을 계산하는 방식에 어느정도 익숙해지고 어떤 로직으로 구성해야 할지 조금 감이 잡힌 것 같다.