[프로그래머스/Java] - 둘만의 암호

seb Incode·2023년 8월 29일
0
post-thumbnail

문제 링크

문제 보기

1차 접근

  1. index만큼 뒤의 알파벳을 바로 구한다.(1차변경) -> cOldChar + index
    (이 때 z 넘어가지 않도록 작업)
  2. 원래 알파벳 < skip배열 < 새 알파벳 사이를 학인한다.
  3. 2번에 해당하는 skip 배열 원소(알파벳)의 개수를 센다.
  4. 새 알파벳 3번에서 구한 개수만큼 뒤의 알파벳으로 변경해준다.(2차변경)

1차 오답

class Solution {
    public String solution(String s, String skip, int index) {
        String answer = "";
        char[] cArrAnswer = new char[s.length()];
        
        for(int i=0;i<s.length();i++){
            char cOldChar = s.charAt(i);
            int nPlusIndex = 0;
            int cNewChar = (cOldChar+index) > 122 ? (cOldChar+index) % 123 + 97 :  (cOldChar+index) % 123;
            for(int j=0;j<skip.length();j++){
                if ( (int)cOldChar < (int)skip.charAt(j) &&  (int)skip.charAt(j) <  cNewChar ){
                    
                    nPlusIndex++;
                    
                }
               
            }
            cNewChar = (cNewChar+nPlusIndex) > 122 ? (cNewChar+nPlusIndex) % 123 + 97 :  (cNewChar+nPlusIndex) % 123;
            cArrAnswer[i] = (char)(cNewChar);
        }
        
        answer = new String(cArrAnswer);
        return answer;
    }
}

원인

1차 접근 순서에서 1.에 오류가 있었다.
index만큼 뒤의 알파벳을 한꺼번에 계산해서 찾으면 z->a로 넘어가는 경우,
2. if문을 건너뛰어버리기 때문이다.
애초에 대소비교로 skip 배열 내를 탐색하는 거 자체가 잘못됐었다.
알파벳을 뒤로 하나씩 바꿔보면서 skip 배열에 그 알파벳이 있는지 확인하고 작업하는 게 핵심 접근이었다.

접근 방법

알파벳을 뒤로 하나씩 바꿔보면서 skip 배열에 그 알파벳이 있는지 확인하고 작업

최종 코드

class Solution {
    public String solution(String s, String skip, int index) {
        String answer = "";
        char[] cArrAnswer = new char[s.length()];
        
        for(int i=0;i<s.length();i++){
            char cOldChar = s.charAt(i);
            int cNewChar = cOldChar;
            // index 길이만큼 반복
            for(int j=0;j<index;j++){
                cNewChar = cNewChar + 1;    // 알파벳 1자씩 뒤로
                if (cNewChar > 122) {   //'z'를 벗어나는 경우
                    cNewChar = (int)'a';    // 'a'로 돌아온다
                }
                
                //바꾼 문자가 skip해야 할 문자인지 확인하고 건너뛴다
                for(int p =0;p<skip.length();p++){
                    if ((char)cNewChar == skip.charAt(p)){
                        --j;
                        
                        break;
                    }
                }
               
            }
            
            cArrAnswer[i] = (char)cNewChar;
           
        }
        
        answer = new String(cArrAnswer);
        return answer;
    }
}

0개의 댓글