#15 알고리즘 연습 - 시저암호
문제 설명
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어
AB는 1만큼 밀면
BC가 되고, 3만큼 밀면
DE가 됩니다.
z는 1만큼 밀면
a가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.
제한 조건
- 공백은 아무리 밀어도 공백입니다.
- s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.
- s의 길이는 8000이하입니다.
- n은 1 이상, 25이하인 자연수입니다.
입출력 예
|
---|
문제 풀이 IDEA
문제에서 n은 25 이하라는 제약이 있기때문에 만약 ASCII코드가 우리가 원하고자 하는 ASCII의 범위를 넘어서는 것을 방지하기 위해 조건문을 걸어
특정 ASCII 값 이상 넘어가면 알파벳갯수 만큼 ASCII를 빼서 다시금 ASCII코드가 알파벳을 가르키도록 해준다
나의 코드
다른 코드
개인적인 생각으로 제약 조건이 없어서 n이 25이상이라면 아래의 코드가 좀더 범용적으로 사용될수 있지만
25라는 조건 하에서는 내 코드가 좀더 낫지 않을까 한다.
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 = ""; int num = 0; for (int i = 0 ; i < s.length();i++){ //문자열의 길이만큼 for문을 돌린다 num = s.charAt(i); //문자열의 i번째 char를 가져온다 그런데 int에 chr를 넣으므로 ASCII 값으로 num안에 들어가게 된다 if (num == 32){ // 만약 num이 공백이면 num = num -n; num의 ASCII값 - n (맨 마지막에 +n을 해주기에 공백을 유지하기위해 이렇게 처리) } else if (num < 91){ // 뽑아낸 문자가 대문자인가? if(num+n >= 91){ // ASCII코드이 합산 값이 알파벳 범위를 넘으면 num = num - 26; //-26을 해서 다시 알파벳 범위로 불러오자 } } else{ // 뽑아낸 문자가 소문자인가? if(num+n>=123){ num = num-26; } } answer += Character.toString ((char) num+n); //이렇게 해주면 num의 값은 공백의 경우 -n이 된 ASCII이고 } //알파벳의 경우 범위를 넘는경우 +n을 하면 알파벳의 범위에 들어오게 num이 설정됨 return answer; } } |
다른 코드
class Caesar { String caesar(String s, int n) { String result = ""; n = n % 26; //이건 왜 해준걸까 그냥 n으로 가져와도 된다 for (int i = 0; i < s.length(); i++) { char ch = s.charAt(i); //string의 하나하나 char를 가져와서 if (Character.isLowerCase(ch)) { //만약 소문자면 ch = (char) ((ch - 'a' + n) % 26 + 'a'); //ch의 ascii에 'a'의 ascii를 빼고 } else if (Character.isUpperCase(ch)) { n을 더해준 값을 26으로 나누어 더해도 알파벳 범위 안에 놀도록 ch = (char) ((ch - 'A' + n) % 26 + 'A'); 'a'의 ascii에 더해서 char로 형변환 } result += ch; } return result; }
개인적인 생각으로 제약 조건이 없어서 n이 25이상이라면 아래의 코드가 좀더 범용적으로 사용될수 있지만
25라는 조건 하에서는 내 코드가 좀더 낫지 않을까 한다.
출처 : 프로그래머스
댓글 없음:
댓글 쓰기