[HackerRank] Caesar Cipher

아르당·2023년 12월 28일

HackerRank

목록 보기
56/109
post-thumbnail

문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음

문제

Julius Caesar는 기밀 정보를 암호화하여 보호했다. Caeserd의 암호는 각 글자를 각 글자의 수만큼 바꾼다. 만약 알파벳이 끝난다면, 알파벳의 처음으로 돌아간다. 예를 들면 알파벳 w, x, y, z를 각각 3만큼 이동한 경우 z, a, b, c가 된다.

Example

s = There's-a-starman-wating-in-the-sky
k = 3

알파벳은 3만큼 이동하면, 위와 같이 매핑된다. 암호화된 문자열은 Wkhuh'v-d-vwdupdq-zdlwlqj-lq-wkh-vnb이다.

Note

문자만 암호화하고, 특수문자는 암호화하지 않는다.

Function Description

caesarCipher 함수를 완성해라.
caesarCipher 함수는 아래와 같은 매개변수를 가지고 있다.

  • String s: 암호화 되기 전 문장
  • int k: 알파벳을 회전시킬 수

Returns

  • String: 암화화된 문자열

Constraints

  • 1 <= n <= 100
  • 0 <= k <= 100

Solved

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;

All Code

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();
}
profile
내 마음대로 코드 작성하는 세상

0개의 댓글