728x90
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/12926
⭐️ 코드
public String solution(String s, int n) {
String answer = "";
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= 'a' && c <= 'z') {
answer += (char) ('a' + (c + n - 'a') % 26);
} else if (c >= 'A' && c <= 'Z') {
answer += (char) ('A' + (c + n - 'A') % 26);
} else {
answer += c;
}
}
return answer;
}
💡 문제 풀이
이번 문제도 문자열 포스팅처럼 Ascii코드를 활용한 문제다.
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= 'a' && c <= 'z') {
answer += (char) ('a' + (c + n - 'a') % 26);
} else if (c >= 'A' && c <= 'Z') {
answer += (char) ('A' + (c + n - 'A') % 26);
} else {
answer += c;
}
}
우리가 가진 문자열 s를 문자 하나씩 뽑아내서 연산을 하는 방식으로 진행한다.
if 문과 else if 문에서 문자(c) 연산을 하게 되는데 우리가 원하는 값은 기존의 문자열에서 보여줬던 문자의 다음 알파벳으로 출력해 달라는 것이다.
answer += (char)('A' + (c + n - 'A')%26);
위 코드 하나만으로 계산을 해보자. 알파벳의 아스키코드 값은 아래와 같다.
그냥 문제를 풀며 기존 문자에 n 값을 더하면 된다고 생각을 하겠지만 만약 Z에서 n 값을 더하면 다른 문자가 출력될 가능성이 있다.
문제가 요구하는 사항은 대문자면 Z에서 1을 밀면 A가 출력되어야 하고 소문자면 z에서 3을 밀면 c가 출력되어야 한다.
이 조건을 만족시키기 위해서는 %를 통한 나머지 연산을 해줘야 한다.
알파벳은 총 26개를 가지고 있기 때문에 문자열(s)에서 하나씩 뽑은 문자(c)에 얼마나 뒤의 문자를 출력하는지에 대한 정수(n)를 더하고 거기서 'A'를 빼게 되면 Z를 넘어가는 숫자가 나와도 결국 나머지를 계산해서 다시 'A'라는 문자에 더해주기 때문에 정확하게 출력된다.
뭔가 조금 복잡하지만 우리는 나머지 연산을 많이 하기 때문에 이 방식을 꼭 머리속에 담아두길 바란다.
👀 후기
수학은 싫은데.. 🥲
728x90
반응형