프로그래머스 둘만의 암호 (java)

byeol·2023년 3월 25일
0

접근(맞았지만 30분이내 풀기 실패)

https://school.programmers.co.kr/learn/courses/30/lessons/155652#qna

알파벳 소문자로 이루어진 문자열 : s,
알파벳(a-z)에서 제외할 문자열 : skip,
그리고 s의 각 알파벳에서 얼마큼 건너띌 것인지를 나타내는 정수 : index
가 주어진다.

이 문제를 처음에 replace로 접근했고 그래서 30분 이내 풀기를 실패했다.
replace로 한다면 과거에 바꾼 값에 대해 다시 바꾸기 때문에 문제가 발생한다.

결국 각 하나하나 바꾸고 그 결과를 빈 문자열 String에 차곡차곡 추가하는 방법으로 접근해야 한다.

과정

처음에 테스트케이스로 주어진 "aukks"의 결과값이 "havvy"로 나왔는데
그 이유는 "happs" 2번째에서 p로 바꿔놓은 값이
"happs" 3번째 과정에서 "havvs"로 바꾸기 때문이다.

따라서 replace를 이용하지 않고

그냥 s의 문자 하나하나 접근하도록 한다.

또한 index 입력값이 skip이 제외된 알파벳 배열 길이의 2배, 3배도 가능하기 때문에 %를 이용하여 구한다.

   if(new_index>=alph.length()){
        new_index=new_index%alph.length();
   }

처음에 new_index=new_index-alph.length();로 접근하였는데 3,17,18,19 테스트 케이스에서 런타임 에러가 발생하였다.

풀이(java)

import java.util.*;
import java.io.*;

class Solution {
    
    static String alph = "abcdefghijklmnopqrstuvwxyz";
    
    public String solution(String s, String skip, int index) {
        
        
        String answer="";
        
        // skip에 있는 것들 제거
        
        for(String sk_t : skip.split("")){
            alph = alph.replace(sk_t,"");
        }
        System.out.println("alph:"+alph);
        
        //바꾸기 
        for(String s_t : s.split("")){
            
            int origin = alph.indexOf(s_t);
            int new_index = origin + index;
            
            //index의 길이가 alph.length의 길이를 한번이 아니라 여러번 넘길 수도 있음!! 3,17,18,19
            if(new_index>=alph.length()){
               
                new_index=new_index%alph.length();
            }
           
            answer+=alph.charAt(new_index)+"";
            
        }
        
      return answer;
        
    }
    
}
profile
꾸준하게 Ready, Set, Go!

0개의 댓글