GitHub - leemeo3/algorithm: This is a auto push repository for Baekjoon Online Judge created with [BaekjoonHub](https://github.c
This is a auto push repository for Baekjoon Online Judge created with [BaekjoonHub](https://github.com/BaekjoonHub/BaekjoonHub). - GitHub - leemeo3/algorithm: This is a auto push repository for Bae...
github.com
순수하게 아스키코드에 +n만큼만 하면 되는 문제라고 생각했는데 n의 범위가 최대 25였기에 아스키코드값을 벗어나는
문제가 있었다.
이는 "z"를 1만큼 밀면 "a"가 된다는 규칙을 벗어나기 때문에 예외처리는 필수적으로 필요했다.
정말 여러가지를 생각해봤는데 도무지 다른 좋은 방법은 떠오르지 않아서 위의 코드와 같은 형식으로 코딩했다.
1. 대문자, 소문자, 공백으로만 이루어져있기에 대문자와 소문자의 범위만 걸러내는 if문을 생성
2. 생성한 변수에 일단 n까지 모두 더한 아스키 코드를 만든다.
3. 대문자, 소문자 범위의 영역에 맞는 최대값을 벗어날 경우와 아닐 경우 구분
4. 벗어날 경우 문자 범위의 영역만큼을 빼준다 (-26)
이와 같은 로직으로 코드를 짰고 성공했다.
n만큼 문자 범위의 영역에서만 반복할 코드를 짜려고 했으나 구현난이도가 어려워서 구현하진 못했다.
다른 사람들의 풀이를 보며 굉장한 풀이를 봤는데
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));
}
}
isUpperCase() / isLowerCase()에 매개변수가 들어갈 수 있다는걸 처음 알았다.
매개변수에 s문자열의 각 문자를 넣어 아스키코드를 통해 소문자범위인지 대문자범위인지를 체크하고
그를 통해 변수에 들어갈 값을 처리하는데 정말 간결하지만 정확히 어떻게 그 범위안에서만 있을 수 있는지
이해가 잘 되질 않는다.
%26을 통해 그 범위안에서 머무르게 하는건 알것 같으면서도 다른 코드들이 이해가 잘 되질 않는다.
하지만 정말 간결하게 잘 짠 코드인거같다.
추후에 아스키코드 관련된 문제를 다시 만났을때 이 코드에 대한 기억을 떠올려서 사용할 수 있었으면 좋겠다.
'algorithm' 카테고리의 다른 글
[프로그래머스] Lv 1 신규 아이디 추천 (0) | 2022.11.23 |
---|---|
[프로그래머스] Lv 1 소수 만들기 (0) | 2022.11.23 |
[프로그래머스] Lv 1 문자열 내림차순으로 배치하기 (0) | 2022.11.23 |
[프로그래머스] Lv 1 최소 직사각형 (0) | 2022.11.22 |
[프로그래머스] Lv 1 두개 뽑아서 더하기 (0) | 2022.11.22 |