문제 설명
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.
제한 조건
- 공백은 아무리 밀어도 공백입니다.
- s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.
- s의 길이는 8000이하입니다.
- n은 1 이상, 25이하인 자연수입니다.
class Solution {
public String solution(String s, int n) {
// 입력 문자열 s를 char 배열로 변환
char[] carr = s.toCharArray();
// 결과를 저장할 StringBuilder 객체 생성
StringBuilder sb = new StringBuilder();
// 배열 carr의 각 문자 c에 대해 반복
for (char c : carr) {
char now;
// 알파벳인 경우만 시저 암호 적용
if (Character.isAlphabetic(c)) {
if (Character.isUpperCase(c)) {
// 대문자인 경우
now = (char) ((c - 'A' + n) % 26 + 'A');
} else {
// 소문자인 경우
now = (char) ((c - 'a' + n) % 26 + 'a');
}
} else {
// 알파벳이 아닌 경우 그대로 유지
now = c;
}
// 결과 StringBuilder에 변환된 문자 추가
sb.append(now);
}
// StringBuilder를 String으로 변환하여 반환
return sb.toString();
}
}
코드 동작 설명
- 반복문 (for (char c : carr)):
- 배열 carr의 각 문자 c에 대해 반복합니다.
- char now;를 선언하여 암호화된 문자를 저장할 변수를 초기화합니다.
- 알파벳 여부 확인 (if (Character.isAlphabetic(c))):
- c가 알파벳인지 확인합니다.
- 대문자인 경우와 소문자인 경우로 분기하여 시저 암호를 적용합니다.
- 시저 암호 적용:
- 대문자인 경우: (c - 'A' + n) % 26 + 'A'를 계산하여 시저 암호를 적용합니다.
- 소문자인 경우: (c - 'a' + n) % 26 + 'a'를 계산하여 시저 암호를 적용합니다.
- 계산 결과는 다시 문자로 캐스팅하여 now에 저장합니다.
- 알파벳이 아닌 경우:
- 그대로 c를 now에 저장합니다.
- 결과 문자열 생성:
- 변환된 문자 now를 sb에 추가합니다.
- 반환:
- sb를 toString() 메서드로 변환하여 암호화된 문자열을 반환합니다.
이 코드는 입력 문자열을 시저 암호 방식으로 변환하여 반환하는 기능을 수행합니다. n이 양수인 경우 문자열을 오른쪽으로 n만큼 이동시키고, n이 음수인 경우 왼쪽으로 -n만큼 이동시킵니다.
시저 암호 적용 원리 (대문자인 경우):
- 암호화 과정:
- 주어진 문자 c가 대문자 알파벳인 경우, ASCII 값으로 변환하여 처리합니다.
- 각 문자는 ASCII 값으로 표현되며, 'A'는 65부터 시작하여 'Z'는 90까지의 값입니다.
- 예를 들어, 'A'는 ASCII 값으로 65, 'B'는 66, ..., 'Z'는 90입니다.
- 공식 적용:
- 시저 암호에서는 문자를 주어진 거리 n만큼 밀어서 다른 문자로 대치합니다.
- c - 'A'는 주어진 문자 c에서 'A'의 ASCII 값인 65를 뺀 값입니다. 이렇게 하면 해당 문자의 상대적 위치를 얻을 수 있습니다.
- + n은 주어진 거리 n만큼 이동시킵니다.
- % 26은 알파벳의 길이를 넘어가는 경우를 처리하기 위해 26으로 나눈 나머지를 취합니다. 이렇게 하면 알파벳의 한 바퀴를 넘어서면 다시 처음부터 시작하게 됩니다.
- + 'A'는 다시 ASCII 값으로 변환하여 원래의 대문자 알파벳을 얻습니다.
- 예시 설명:
- 예를 들어, 'A'를 3만큼 밀 경우:
- ('A' - 'A' + 3) % 26 + 'A' 계산 결과는 (0 + 3) % 26 + 65가 되며, 이는 ASCII 값으로 68에 해당하는 문자인 'D'가 됩니다.
- 'Z'를 3만큼 밀 경우:
- ('Z' - 'A' + 3) % 26 + 'A' 계산 결과는 (25 + 3) % 26 + 65가 되며, 이는 ASCII 값으로 68에 해당하는 문자인 'C'가 됩니다 (Z 다음에 A부터 시작).
- 예를 들어, 'A'를 3만큼 밀 경우:
이 과정을 통해 주어진 문자를 시저 암호화하여 다른 문자로 변환할 수 있습니다.
'(Java)코테연습' 카테고리의 다른 글
문자열 내 마음대로 정렬하기 (0) | 2024.07.17 |
---|---|
숫자 문자열과 영단어 (0) | 2024.07.16 |
영어 단어 맞추기 (0) | 2024.07.12 |
문자열끼리 크기 비교하는 경우 (0) | 2024.07.12 |
각각의 배열에서 3개의 정수 합이 0이 되어야 하는경우 (0) | 2024.07.12 |