Algorithms/- 프로그래머스
프로그래머스 - 시저 암호 [자바]
자굿
2022. 2. 2. 11:12
- 문제 링크 : 시저 암호
코딩테스트 연습 - 시저 암호
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀
programmers.co.kr
정답
class Solution {
public String solution(String s, int n) {
//소문자 97 ~ 122
//대문자 65 ~ 90
int idx = 0;
char[] arr = s.toCharArray();
for(char ch : arr){
int a = (int)ch;
if(a >= 65 && a <= 90){
if(a + n > 90){
a += n - 26;
}else{
a += n;
}
}else if(a >= 97 && a <= 122){
if(a + n > 122){
a += n - 26;
}else{
a += n;
}
}
arr[idx] = (char)a;
idx++;
}
return new String(arr);
}
}
분석
- 아스키코드를 이용하여 알파벳을 변환하는 문제
참고할 만한 정답
class Caesar {
public String caesar(String s, int _n) {
return s.chars().map(c -> {
int n = _n % 26;
if (c >= 'a' && c <= 'z') {
return 'a' + (c - 'a' + n) % 26;
} else if (c >= 'A' && c <= 'Z') {
return 'A' + (c - 'A' + n) % 26;
} else {
return c;
}
}).mapToObj(c -> String.valueOf((char)c))
.reduce((a, b) -> a + b).orElse("");
}
}
비교 분석
- 스트림을 사용하면 이 경우는 엄청 느리다.
- 여기서 배울점은 아스키코드 대신에 'a' 또는 'A' 같이 사용하는 것과
- n을 26으로 나눈 나머지만 사용하면 n이 어떠한 수가 와도 상관없이 더 해주면 된다.(문제가 변경되어 n이 25이하 이지만 이 기법은 알고 있으면 좋은 기법 같음.)
- if문도 없앨 수 있었고 좀 더 간결한 코드가 되었다.
비교 분석 반영
class Solution {
public String solution(String s, int n) {
int idx = 0;
char[] arr = s.toCharArray();
for(char ch : arr){
int a = (int)ch;
if(a >= 'A' && a <= 'Z'){
a = 'A' + (a - 'A' + n) % 26;
}else if(a >= 'a' && a <= 'z'){
a = 'a' + (a - 'a' + n) % 26;
}
arr[idx] = (char)a;
idx++;
}
return new String(arr);
}
}
반응형