본문 바로가기
Algorithm (PS)/프로그래머스

[프로그래머스 Level 1] 시저 암호(Java)

by 태크민 2023. 8. 26.

문제

https://school.programmers.co.kr/learn/courses/30/lessons/12926

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이

1. 문자가 대소문자인지 체크하는 플래그를 둔다.

2.  소문자로 변환한다.

3. 문자와 n만큼 더한후 아스키 코드로 변환한다.

3. 아스키 코드가 'a' ~ 'z' 사이에 포함되면 그 값을 저장

4.  'z'를 넘어간다면 다시 'a' 부터 시작해야 하므로 26을 빼주고 값을 저장

5. 원래 문자가 대문자라면 대문자 변환 후 answer에 더하고, 소문자였다면 그냥 변환없이 더한다.

 

코드

import java.util.*;
import java.lang.*;
class Solution {
    public String solution(String s, int n) {
        String answer = "";
        for(int i=0; i<s.length(); i++){
            if(s.charAt(i)==' '){
                answer+=" ";
            }else{
                boolean isUpperCase=Character.isUpperCase(s.charAt(i)); //대문자 확인                    
                char c=Character.toLowerCase(s.charAt(i));
                int aCode = c+n; //거리 밀기
                if((char)aCode>='a' && (char)aCode<='z'){ //거리 밀었을 때 a~z 사이
                    c=(char)aCode;
                }else{ //거리 밀었을 때z를 넘는 경우
                    aCode-=26;
                    c=(char)aCode;    
                }
                if(isUpperCase){ //원래 대문자였다면 다시 대문자로 변환
                    answer+=Character.toUpperCase(c);
                  }else{
                    answer+=(c);
                }
            }
        }
        return answer;
    }
}

 

다른사람 풀이 코드

class Solution {
    public String solution(String s, int n) {
          String answer = "";
          
          
          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');
              }
              
              answer += ch;
          }
              
          
          return answer;
      }
}