출처: https://school.programmers.co.kr/learn/courses/30/lessons/155652
문제 설명
두 문자열 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
입출력 예
s skip index result
"aukks" "wbqd" 5 "happy"
입출력 예 설명
입출력 예 #1
본문 내용과 일치합니다.
내가 작성한 코드문이다. 몇일 안하니 감을 잃고,
문자 반복문을 어디다 둬야할지 헷갈렸다.
class Solution {
public String solution(String s, String skip, int index) {
String answer = "";
String arr[] = s.split("");
int cnt = 0;
// 문자열 s의 각 알파벳을 index만큼 뒤의 알파벳으로 바꿔줍니다.
// index만큼의 뒤의 알파벳이 z를 넘어갈 경우 다시 a로 돌아갑니다.
//abcdefghijklmnopqrstuvwxyz
// a에서 5 뒤에 있는 만큼 세되 skip 배열 원소 스킵 = h
// u에서 5 뒤에 있는 만큼 세되 skip 배열 원소 스킵 = a
// k '' = p
// s '' = y
for(int i = 0; i < arr.length; i++){
// 그렇다면 알파벳 반복문을 어디다 둬야할까?
for (char c = 'a'; c <= 'z'; c++) {
if(skip.contains(arr[i])){// 배열 원소 하나가 skip 문자열에 포함되어있을시 세지 않는다.
continue;// skip한다.
} else {
String str = String.valueOf(c);// 문자를 문자열로
// str과 같은 거에서 5인덱스 앞이어야 한다.
}
}
answer+=str;// answer변수에 문자열 값 저장.
}
return answer;
}
}
어렵게 생각했던 이유
"알파벳 순회"를 하면서
"skip에 포함된 문자는 건너뛰고"
"index 만큼 이동"해야 하기 때문.
그리고 사실 arr[] 배열을 한번 더 만들 필요없이
s문자열중 문자를 추출하기만 하면 되기에 이것도 필요가 없다.
class Solution {
public String solution(String s, String skip, int index) {
String answer = "";
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i); // s의 i번째 문자
int cnt = 0; // 이동한 횟수
while (cnt < index) {
ch++; // 다음 알파벳으로 이동
if (ch > 'z') { // z를 넘어가면
ch = 'a'; // 다시 a로
}
// skip 문자열에 포함되어 있으면 세지 않음
if (skip.contains(String.valueOf(ch))) {
continue;
}
cnt++; // skip에 없는 문자일 때만 이동 카운트 증가
}
answer += ch;
}
return answer;
}
}
이렇게 하니 정말 깔끔 하고 요구사항도 충족된다.