JJUNNAK's

[ 코딩 테스트 예제 ] 02. 둘만의 암호 - Java 본문

코딩 테스트

[ 코딩 테스트 예제 ] 02. 둘만의 암호 - Java

최낙준 2023. 2. 21. 01:12
문제
두 문자열 s와 skip, 그리고 자연수 index가 주어질 때, 다음 규칙에 따라 문자열을 만들려 합니다. 암호의 규칙은 다음과 같습니다.
문자열 s의 각 알파벳을 index만큼 뒤의 알파벳으로 바꿔줍니다. index만큼의 뒤의 알파벳이 z를 넘어갈 경우 다시 a로 돌아갑니다. skip에 있는 알파벳은 제외하고 건너뜁니다.
예를 들어 s = "aukks", skip = "wbqd", index = 5일 때, a에서 5만큼 뒤에 있는 알파벳은 f지만 [b, c, d, e, f]에서 'b'와 'd'는 skip에 포함되므로 세지 않습니다. 따라서 'b', 'd'를 제외하고 'a'에서 5만큼 뒤에 있는 알파벳은 [c, e, f, g, h] 순서에 의해 'h'가 됩니다. 나머지 "ukks" 또한 위 규칙대로 바꾸면 "appy"가 되며 결과는 "happy"가 됩니다.
두 문자열 s와 skip, 그리고 자연수 index가 매개변수로 주어질 때 위 규칙대로 s를 변환한 결과를 return하도록 solution 함수를 완성해 주세요.

[ 제한사항 ]
5 ≤ s의 길이 ≤ 50
1 ≤ skip의 길이 ≤ 10
s와 skip은 알파벳 소문자로만 이루어져 있습니다.
skip에 포함되는 알파벳은 s에 포함되지 않습니다.
1 ≤ index ≤ 20

 


풀이
import java.util.Arrays;
import java.util.*;

class Solution {
    public String solution(String s, String skip, int index) {
        // s = 힌트, skip = 제외할 문자, index = 넘어갈 인덱스
        String answer = "";
        String[] lang = {"a","b","c","d","e","f",
                          "g","h","i","j","k",
                          "l","m","n","o","p","q","r",
                          "s","t","u","v","w","x","y","z"}; // 0~26
        
        
        
        // 01. 알파벳 배열에서 skip에 해당하는 요소 제거.
        List<String> lang_List = new ArrayList<>(Arrays.asList(lang));
        for(int z=0; z<skip.length(); z++){
                lang_List.removeAll(Arrays.asList(Character.toString(skip.charAt(z))));
                lang = lang_List.toArray(new String[0]);
                }
        
        // 02. s의 인덱스 값에서 + index 만큼 한 위치의 값만 추출.
        for(int i = 0; i<s.length(); i++){
            String target = Character.toString(s.charAt(i));
            int start_idx = Arrays.binarySearch(lang, target);
            int idx = start_idx + index;
            if(idx > lang.length-1){
                while(idx > lang.length-1){
                    idx -= lang.length;
                }
            }
            answer += lang[idx];
        }
        return answer;
    }
}

 

전체 알파벳을 담은 배열 lang을 선언한 후, skip에 들어있는 문자들만 제외함.

이 문제의 관건은 주어진 s의 인덱스 + index의 값이  배열의 길이를 넘어가는 경우를 처리하는 것인데

처음에는

if( idx > lang.length - 1){

   idx -= lang.length;

}

으로 처리를 했는데 일부 테스트에서 런타임 오류가 났음.

 

예를 들어 index = 20이고 skip을 제외한 lang의 길이가 16이라고 가정했을 때

idx = 35가 됨 위의 if문을 거치면서 idx = 20이 되지만  lang의 최대길이는 16이기 때문에

IndexOutOfBoundsException 이 나게 됨.

 

따라서 while(idx > lang.length-1)으로 바꾸면서 idx가 lang의 길이 밑으로 내려올 때까지 제어를 해주어야 함.

 

 

 

 

 

 

문제 출처

https://school.programmers.co.kr/learn/challenges?order=recent&languages=java 

 

코딩테스트 연습 | 프로그래머스 스쿨

개발자 취업의 필수 관문 코딩테스트를 철저하게 연습하고 대비할 수 있는 문제를 총망라! 프로그래머스에서 선발한 문제로 유형을 파악하고 실력을 업그레이드해 보세요!

school.programmers.co.kr

 

Comments