[JAVA] 시저 암호

태로미·2023년 10월 5일
0

Programmers

목록 보기
27/29
post-thumbnail

❓문제


어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다.
"z"는 1만큼 밀면 "a"가 됩니다.
문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.



🚫제한


  • 공백은 아무리 밀어도 공백입니다.
  • s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.
  • s의 길이는 8000이하입니다.
  • n은 1 이상, 25이하인 자연수입니다.


💻입출력 예


snresult
"AB"1"BC"
"z"1"a"
"a B z"4"e F d"













📝해결


향상된 for문 & char 배열

class Solution {
  public String solution(String s, int n) {

    String answer = "";

    for(char ch : s.toCharArray()) {
      if(ch == ' ') {
        answer += ch;
      }
      else if(ch >= 'a' && ch <= 'z') {
        answer += (char)('a' + (ch-'a' +n) % 26);
      }
      else {
        answer += (char)('A' + (ch-'A' +n) % 26);
      }
    }

    return answer;
  }
}
  • 문자열 s를 char 배열로 만든것을 char타입 ch에 하나씩 넣어 향상된 for문을 돌림.
  • 문자가 공백일 경우, 아무리 밀어도 공백이므로 공백으로 누적합 처리.
  • 문자가 소문자일 경우와 아닐 경우로 나눔.
  • ch - ’a’ 는 a에서부터의 거리이며, 그 거리(a에서부터 원래 문자 ch의 차이)에서 n만큼 멀어지게 됨.
    • 원래 a에서 ch만큼의 차이에서 n만큼 더 멀어지는 것.
    • 즉, 원래 값 + 추가된 값
  • 그 후, 26으로 나누는 의미는 z, Z를 넘어갔을 때를 처리하기 위함.
    • 알파벳의 대소문자는 각각 26개
    • 26을 나눈 나머지가 0보다 클 경우, 이는 알파벳 전체를 n바퀴 돌았다는 의미. (26의 배수만큼 돈 것.)
    • 예를 들어 26을 나눈 나머지가 1일 경우, 알파벳 전체를 n바퀴 돌고 a가 된 것.
  • 마지막으로 a에 a에서부터 n만큼 멀어진 거리를더함으로써 최종 값을 구할 수 있음.
  • (A/a와 원래 문자의 차이 + 밀리는 수 n)을 26으로 나눈 나머지 == 루프를 돌고나서의 차이 (결과적으로 밀린 정도)
  • 문제에서는 소문자 z 경우만 알려줬지만 사실상 대문자 Z도 마찬가지.
  • 결론은 정수를 더했을 때, z 또는 Z를 넘어가게 되면 a 또는 A부터 돌아가게 하는 것.

아스키 코드표







💭마무리

  • Level_1 / 35:43
  • Point
    – 아스키코드 활용
    – 알파벳 개수 활용
    – 문자 사이의 거리 활용

a에서부터의 거리를 계산한다고 혼자 손으로 테이블 여기저기 짚어가며 이해했다ㅠㅠㅠㅋㅋㅋㅋ공간감각이 이렇게나 없다니..실화냐😅ㅠㅠㅠㅠㅠㅠㅠ
그래도 한 번 이해하고나니 코드를 봤을 때 머릿속에 그림이 잘 그려진다
불행 중 다행...🥲🥲🥲
공간감각은 어떻게 키워야 하지?
상상을 많이 해야 하나?......🤔


profile
Here And Now

0개의 댓글