-
[프로그래머스/JAVA] 시저암호Algorithm/Java 2024. 11. 17. 18:22
https://school.programmers.co.kr/learn/courses/30/lessons/12926#
📌 문제 요약
주어진 문자열 s의 각 알파벳을 n만큼 밀어서 암호화하는 문제로, 대문자와 소문자는 각각 순환되며, 공백은 그대로 유지해야 합니다.
[ 오답 노트 ]
❌ 기존 오답 코드class Solution { public String solution(String s, int n) { String answer = ""; // AB -> BC -> CD -> DE -> EF -> FG // 1 1 1 // a B z -> b C a -> c D b -> d E c -> e F d // 1 1 1 1 // 문자에 공백이 있을 때, 없을 때 구분? String[] str = s.split(" "); // ["AB"] ["a", "B", "z"] char ch; for(int i = 0; i < str.length; i++) { if(str[i].length() > 1) { for(int j = 0; j < str[i].length(); j++) { // 'A'+ 1 = "B"? ch = (char)(Integer.parseInt(str[i].charAt(j)) + 1); answer += String.valueOf(ch); } }else{ answer += str[i] + 1; } } return answer; } }
📌 기존 코드의 문제점1. split(" ") 사용으로 인한 공백 처리 문제
- 공백으로 문자열을 나누면 공백이 사라져 원래 문자열의 공백 정보를 잃습니다.
- 예: "a B z" → ["a", "B", "z"]
2. Integer.parseInt(str[i].charAt(j)) 사용 오류
- char 타입을 int로 변환하려면 ASCII 값을 직접 활용하거나 Character 관련 메서드를 사용해야 합니다.
- Integer.parseInt는 문자열을 숫자로 변환할 때 사용하는 메서드로 char 변환에는 부적합합니다.
3. 알파벳 범위 초과 처리 누락
- z에서 1을 더하면 a로 순환해야 하지만, 해당 처리가 없습니다.
- 대문자(A
Z)와 소문자(az)도 각각 독립적으로 순환해야 합니다.
4. else 블록의 처리 오류
- answer += str[i] + 1은 문자열과 숫자를 더해 문자열이 아닌 값이 나옵니다.
- 예: "a" + 1은 "a1"이 아니라 ASCII 값 연산이 됩니다.
[ 정답 코드 & 올바른 풀이 ]
📌 올바른 풀이1. 공백 처리 유지
공백을 제거하지 않고 원본 문자열의 모든 문자를 순서대로 처리합니다.
2. char와 ASCII 값 활용
- char를 그대로 사용하며, 알파벳 순환을 위해 ch - 'a' 또는 ch - 'A'를 계산합니다.
3. 알파벳 순환 처리
- (ch - 'a' + n) % 26 + 'a'로 소문자를 순환 처리합니다.
- 대문자도 동일한 방식으로 처리하되, 기준값을 'A'로 설정합니다.
4. 효율적인 반복
split을 사용하지 않고, 문자열을 한 문자씩 처리하여 불필요한 배열 분할 및 추가 반복을 제거했습니다.
📌 정답 코드class Solution { public String solution(String s, int n) { String answer = ""; // AB -> BC -> CD -> DE -> EF -> FG // 1 1 1 // a B z -> b C a -> c D b -> d E c -> e F d // 1 1 1 1 for(int i = 0; i < s.length(); i++) { char ch = s.charAt(i); if(ch >= 'a' && ch <= 'z') { // 원래 알파벳 - 'a' + n = 이동된 알파벳의 위치 // 이동된 알파벳 위치 + 'a' = 이동된 알파벳 // % 26 을 하는 이유는 z + 1 했을 때 a로 순환되게 하기 위해 ch = (char)((ch - 'a' + n) % 26 + 'a'); }else if(ch >= 'A' && ch <= 'Z') { ch = (char)((ch - 'A' + n) % 26 + 'A'); } answer += ch; } return answer; } }
반응형'Algorithm > Java' 카테고리의 다른 글
[프로그래머스/JAVA] 귤 고르기 (0) 2024.11.24 [프로그래머스/JAVA] 카드 뭉치 (0) 2024.11.24 [백준/JAVA] 18311번 : 큰 수 구성하기 (0) 2024.11.10 [프로그래머스/JAVA] 점프와 순간 이동 (0) 2024.10.31 [프로그래머스/JAVA] 피보나치 수 (0) 2024.10.30