2019년 3월 24일 일요일

#15 알고리즘 연습 - 시저암호 JAVA


#15 알고리즘 연습 - 시저암호 


문제 설명
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 AB는 1만큼 밀면 BC가 되고, 3만큼 밀면 DE가 됩니다. z는 1만큼 밀면 a가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.
제한 조건
  • 공백은 아무리 밀어도 공백입니다.
  • s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.
  • s의 길이는 8000이하입니다.
  • n은 1 이상, 25이하인 자연수입니다.
입출력 예
snresult
AB1BC
z1a
a B z4e F d





문제 풀이 IDEA

문제에서 n은 25 이하라는 제약이 있기때문에 만약 ASCII코드가 우리가 원하고자 하는 ASCII의 범위를 넘어서는 것을 방지하기 위해 조건문을 걸어
특정 ASCII 값 이상 넘어가면 알파벳갯수 만큼 ASCII를 빼서 다시금 ASCII코드가 알파벳을 가르키도록 해준다




나의 코드

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라는 조건 하에서는 내 코드가 좀더 낫지 않을까 한다.


출처 : 프로그래머스

댓글 없음:

댓글 쓰기

가장 많이 본 글