
문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음
Julius Caesar는 기밀 정보를 암호화하여 보호했다. Caeserd의 암호는 각 글자를 각 글자의 수만큼 바꾼다. 만약 알파벳이 끝난다면, 알파벳의 처음으로 돌아간다. 예를 들면 알파벳 w, x, y, z를 각각 3만큼 이동한 경우 z, a, b, c가 된다.
s = There's-a-starman-wating-in-the-sky
k = 3
알파벳은 3만큼 이동하면, 위와 같이 매핑된다. 암호화된 문자열은 Wkhuh'v-d-vwdupdq-zdlwlqj-lq-wkh-vnb이다.
문자만 암호화하고, 특수문자는 암호화하지 않는다.
caesarCipher 함수를 완성해라.
caesarCipher 함수는 아래와 같은 매개변수를 가지고 있다.
ASCII Code를 사용하면 해결할 수 있는 문제이다. 하지만 함수형으로 분리하지 않아서 코드가 굉장히 지저분하다.
먼저 결과를 담을 StringBuilder를 생성한다. 그리고 k의 범위가 0 <= k <= 100이라서 알파벳이 여러번 회전할 수 있기때문에 26을 나눈 나머지를 할당해준다.
StringBuilder sb = new StringBuilder();
k %= 26;
반복문을 통해 주어진 문자열을 순회한다. 해당 문자가 대문자, 소문자, 특수문자인지 조건문을 통해 구분한다.
for(int i = 0; i < s.length(); i++){
char cur = s.charAt(i);
if(cur >= 'a' && cur <= 'z'){
}else if(cur >= 'A' && cur <= 'Z'){
}else{
}
}
이제 각 조건 안을 완성한다. 먼저 cur에 k를 더하고, k를 더했을 때 각 z, Z를 넘는지 확인하고 알파벳을 처음부터 시작하고, 그렇지 않으면 해당 알파벳을 sb에 추가한다. 특수문자는 바로 sb에 추가한다.
for(int i = 0; i < s.length(); i++){
char cur = s.charAt(i);
if(cur >= 'a' && cur <= 'z'){
cur += k;
if(cur > 'z'){
sb.append(Character.toChars(cur - 26));
}else{
sb.append(cur);
}
}else if(cur >= 'A' && cur <= 'Z'){
cur += k;
if(cur > 'Z'){
sb.append(Character.toChars(cur - 26));
}else{
sb.append(cur);
}
}else{
sb.append(s.charAt(i));
}
}
마지막은 sb를 return한다.
return sb;
public static String caesarCipher(String s, int k) {
StringBuilder sb = new StringBuilder();
k %= 26;
for(int i = 0; i < s.length(); i++){
char cur = s.charAt(i);
if(cur >= 'a' && cur <= 'z'){
cur += k;
if(cur > 'z'){
sb.append(Character.toChars(cur - 26));
}else{
sb.append(cur);
}
}else if(cur >= 'A' && cur <= 'Z'){
cur += k;
if(cur > 'Z'){
sb.append(Character.toChars(cur - 26));
}else{
sb.append(cur);
}
}else{
sb.append(s.charAt(i));
}
}
return sb.toString();
}