JJUNNAK's
[ 코딩 테스트 예제 ] 02. 둘만의 암호 - Java 본문
문제
두 문자열 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
'코딩 테스트' 카테고리의 다른 글
[ 코딩 테스트 예제 ] 06. 폰켓몬 - Java (0) | 2023.02.24 |
---|---|
[ 코딩 테스트 예제 ] 05. 가장 가까운 같은 글자 - Java (0) | 2023.02.23 |
[ 코딩 테스트 예제 ] 04. 기사 단원의 무기 - Java (0) | 2023.02.22 |
[ 코딩 테스트 예제 ] 03. 햄버거 만들기 - Java (0) | 2023.02.22 |
[ 코딩 테스트 예제 ] 01. 크기가 작은 부분 문자열 - Java (0) | 2023.02.21 |
Comments