본문 바로가기

Algorithm/프로그래머스

프로그래머스 level1 문제 : 시저암호(java)

반응형


문제 설명 : 


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


제한 조건 : 

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




이 문제는 엄청 어렵지는 않았네요. 머리를 잘 굴리면 답은 나왔지만...


헷갈렸던 것은 아스키코드를 참고해 char로 뽑아내려했는데 생각이 안나서 다른 방법으로 풀었습니다.


하지만 역시나 답을 보니 다른 분께선 그렇게 풀었더라구요 ㅎㅎ


우선 제 답입니다.


public String solution(String s, int n) {
String answer = "";

String lowerAlphabet = "abcdefghijklmnopqrstuvwxyz";
String upperAlphabet = lowerAlphabet.toUpperCase();

String[] upperA = upperAlphabet.split("");
String[] lowerA = lowerAlphabet.split("");
String[] input = s.split("");

for(int i=0; i<input.length; i++) {
int value = 0;
for(int j=0; j<upperA.length; j++) {
if(input[i].equals(upperA[j])) {
value = j+n;
if(value >= 26) value -= 26;
answer += upperA[value];
break;
} else if(input[i].equals(lowerA[j])) {
value = j+n;
if(value >= 26) value -= 26;
answer += lowerA[value];
break;
} else if(" ".equals(input[i])){
answer += " ";
break;
}
}
}

return answer;
}

일일이 써서 풀기...뜨든..


전 이렇게 풀었습니다. 어떻게든 효율성까지 통과한 풀이입니다.


하지만 다른 분들의 풀이를 보겠습다.


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


제가 풀고자 했던 방식이지만, 역시 쉽지 않네요 ㅎㅎ


더 많은 풀이를 보고 싶지만, 제가 풀고자 했던건 이거고 더이상 좋은? 빠른? 풀이는 괜찮다고 생각해 여기서 마치겠습니다.


char형과 spilt을 좀 연구해봐야겠네요. 


모두 화이팅

반응형