1. 문제 설명
2. 나의 풀이
1. 알파벳 대소문자를 유지하면서 입력받은 숫자에 맞게 이동
2. z를 초과하면 다시 a부터 시작
ascii코드를 이용해서, 조건문 설계하면 되겠다고 생각함
class Solution {
public String solution(String s, int n) {
String answer = "";
char temp = 'a';
int over = 0;
// 알파벳 대문자 65 ~90
// 소문자 97 ~122
for(int i = 0; i < s.length(); i++)
{
temp = s.charAt(i);
if(temp == 32)
{
answer += " ";
continue;
}
if(temp < 91 && temp + n > 90)
{
over = (temp +n) - 90;
temp = (char) (over + 64);
}
else if(temp > 96 && temp + n > 122)
{
over = (temp +n) - 122;
temp = (char) (over + 96);
}
else
{
temp = (char) (temp + n);
}
answer += temp;
}
return answer;
}
}
over는 String s 의 split 값이 Z나 z를 초과했을때 ,
다시 a로 돌아가야 하므로 얼마나 초과했는지 알려주는 변수임
아쉬운점 : 이렇게 풀이하려면 ascii코드로 대문자, 소문자의 범위를 알아야함
그리고 공백을 처리하는 절차가 번거로움
3. 다른 사람의 풀이
class Caesar {
String caesar(String s, int n) {
String result = "";
n = n % 26;
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (Character.isLowerCase(ch)) {
ch = (char) ((ch - 'a' + n) % 26 + 'a');
} else if (Character.isUpperCase(ch)) {
ch = (char) ((ch - 'A' + n) % 26 + 'A');
}
result += ch;
}
return result;
}
public static void main(String[] args) {
Caesar c = new Caesar();
System.out.println("s는 'a B z', n은 4인 경우: " + c.caesar("a B z", 4));
}
}
1. n = n % 26;
알파벳은 26자이므로, n이 26 이상이면 나머지만 사용하면 된다.
예를 들어, n = 30이면 30 % 26 = 4와 같으므로 n = 4와 동일하다.
2. if (Character.isLowerCase(ch)) { ch = (char) ((ch - 'a' + n) % 26 + 'a');
- 'a'를 0, 'b'를 1, ..., 'z'를 25로 변환하여 계산
- (ch - 'a') → 알파벳 인덱스 변환
- (ch - 'a' + n) % 26 → n만큼 이동 후, 알파벳 범위 유지
- 다시 'a'를 더해 문자로 변환
예시
ch = 'a', n = 4
- 'a' - 'a' = 0
- (0 + 4) % 26 = 4
- 4 + 'a' = 'e'
- 결과: 'a' → 'e'
ascii코드를 알 필요 없이 isLower, Upper 인지만 조건문으로 분리해서 처리 후 += 해주면 되는 거였다..
참 똑똑한 사람들이 많다.
'코테 > java' 카테고리의 다른 글
[프로그래머스][java] lv 1 최소직사각형 (0) | 2025.01.17 |
---|---|
[프로그래머스][java] lv 1 월간 코드 챌린지 시즌1 3진법 뒤집기 (1) | 2025.01.15 |
[프로그래머스][java] lv1 이상한 문자 만들기 (0) | 2025.01.10 |
[프로그래머스][java] lv 1 부족한 금액 계산하기 (0) | 2025.01.09 |
lv 1 정수 내림차순으로 배치하기 (2) | 2024.12.20 |