https://programmers.co.kr/learn/courses/30/lessons/12926
코딩테스트 연습 - 시저 암호 | 프로그래머스
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 AB는 1만큼 밀면 BC가 되고, 3만큼 밀면 DE가 됩니다. z는 1만큼 밀면 a가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요. 제한 조건 공백은 아무리 밀어도 공백입니다. s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다. s의 길이는 8000이하입니다.
programmers.co.kr
<시저 암호>
○ 처음 시도한 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class Solution {
public String solution(String s, int n) {
String answer = "";
for(int i=0;i<s.length();i++) {
if((char)(s.charAt(i)+n) > 'Z' && (char)(s.charAt(i)+n) < 'a'
||(char)(s.charAt(i) +n) > 'z') {
answer += (char)(s.charAt(i) + -26 +n);
}else if(s.charAt(i)==' ') {
answer += " ";
}else
answer += (char)(s.charAt(i) + n);
}
return answer;
}
}
|
cs |
[시행착오]
- 문자열 i번지 각각의 아스키코드에 n만큼을 더해준다.
- z또는 Z를 넘어갈때 26을 빼주고 다시 n만큼을 더해준다.
- 문자열의 i번지를 char형태의 배열로 담아 처리해야한다고 생각했다.
charAt() 메소드의 사용이 next().charAt()에서만 쓸 수 있다고 생각했다.
s도 String 배열이기 때문에 점연산자로 s.charAt()으로 접근할 수 있다.
- 대문자와 소문자를 나누지 않아서 Y를 4만큼 증가시킬때 같은 경우 특수문자가 출력됐다.
- 공백 처리를 아스키코드로만 처리해야한다고 생각하였다.
" "를 += 연산자로 더해주면 문자열 그대로 더해져서 출력된다.
○ 다시 수정한 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
class Solution {
public String solution(String s, int n) {
String answer = "";
// s의 길이만큼 반복하여 체크하기
for(int i=0;i<s.length();i++) {
// i번지 알파벳이 대문자일 경우
if(s.charAt(i)>='A' && s.charAt(i)<='Z') {
// n을 더한 값이 Z를 넘어갈 경우
if((char)(s.charAt(i)+n)>'Z')
answer += (char)(s.charAt(i)+n-26); // n을 더하고 26을 빼준다
else
answer += (char)(s.charAt(i)+n); // n만 더해준다
// i번지 알파벳이 소문자일 경우
}else if(s.charAt(i)>='a' && s.charAt(i)<='z') {
// n을 더한 값이 z를 넘어갈 경우
if((char)(s.charAt(i)+n)>'z')
answer += (char)(s.charAt(i)+n-26); // n을 더하고 26을 빼준다
else
answer += (char)(s.charAt(i)+n); // n만 더해준다
// i번지가 공백일 경우
}else if(s.charAt(i)==' ')
answer += " "; // 공백을 String으로 더해주면 그대로
}
return answer;
}
}
|
cs |
- 대문자의 범위와 소문자의 범위를 나누어 구분하였다.
- 대문자와 소문자 if문 안에 z또는 Z를 벗어날 경우를 else문으로 처리하였다.
- 구멍없이 원하는 결과값은 나왔지만 if문이 7개로.. 너무 많다.
○ 좋아요를 많이 받은 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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;
}
}
|
cs |
- Character.isLowerCase() : 소문자를 구분하는 메소드
Character.isUpperCase() : 대문자를 구분하는 메소드
- % 연산자를 사용하여 밀어줄 수를 구하는 방법
'코테 > 프로그래머스' 카테고리의 다른 글
문자열 내림차순으로 배치하기/java/프로그래머스/Level1 (0) | 2020.02.23 |
---|---|
K번째수/java/프로그래머스/Level1 (0) | 2020.02.16 |
약수의 합/java/프로그래머스/Level1 (0) | 2020.02.15 |
2016년/java/프로그래머스/Level1 (0) | 2020.02.15 |
소수 찾기/java/프로그래머스/Level1 (0) | 2020.02.15 |