본문 바로가기

Java/프로그래머스

[JAVA] 프로그래머스 - 시저 암호

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

 

프로그래머스

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

programmers.co.kr

 

 

 

 

정답 

- 현재 문자가 대문자인지 소문자인지 판단하여 기준 문자를 설정

- 대문자일 경우 'A'(아스키코드 65), 소문자인 경우 'a'(아스키코드 97)

- 현재 문자의 위치를 기준 문자로부터의 상대적 위치로 변환한다. 

- 'A' 또는 'a'를 0으로 두고, 이를 n만큼 이동시킨다. 

- 이동된 값이 알파벳 범위 내에 있도록 26으로 나눈 나머지를 구한다. 

- 다시 기준 문자를 더하여 올바른 아스키 코드 값을 얻는다. 

class Solution {
    public String solution(String s, int n) {
        StringBuilder sb = new StringBuilder();
        
        for(int i=0; i<s.length(); i++)
        {
            char cur = s.charAt(i);
            
            //공백일 때 
            if(cur==' ')
            {
                sb.append(' ');
            }
            else
            {
                char base = Character.isUpperCase(cur)?'A':'a';
                char shift = (char)((cur-base+n)%26+base);
                sb.append(shift);
            }
        }
        return sb.toString();
    }
}

 

 

 

다른 사람의 풀이 

 

1)

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;
    }

    public static void main(String[] args) {
        Caesar c = new Caesar();
        System.out.println("s는 'a B z', n은 4인 경우: " + c.caesar("a B z", 4));
    }
}

 

 

2)

 

class Caesar {
    String caesar(String s, int n) {
        String result = "";   
    int i, code;
    for(i=0;i<s.length();i++) {
      if(s.charAt(i)!= ' ') {
        //System.out.println(s.charAt(i));
        code=(int)s.charAt(i);

        if (code >= 65 && code <=90) {
           code=code+n;
           if(code > 90) code=65+((code-91)%26);
        } else if (code >= 97 && code <=122) {
           code=code+n;
           System.out.println(code);
           if(code > 122) code=97+((code-123)%26);
        }

        result=result+Character.toString((char)code);
      } else {
        result=result+Character.toString(s.charAt(i));
      }
    }

        return result;
    }

    public static void main(String[] args) {
        Caesar c = new Caesar();
        System.out.println("s는 'a B z', n은 4인 경우: " + c.caesar("a B z", 4));
    }
}

 

 

3)

 

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+n-'a')%26);
                }else {
                    answer += (char)('A' + (ch+n-'A')%26);
                }
            }
            System.out.println(answer);
            return answer;
        }
    }