두 문자열 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 함수를 완성해주세요.
이 문제를 계속 풀어봤지만 내가 작성한 코드의 채점결과는 '오답'이였다. 그리고 다른 사람의 풀이를 통해 정답을 알 수 있었고, 그 중 너무 간결하게 작성된 코드가 있었다.
const solution = (s, skip, index) => {
let ans = "";
const matched = "abcdefghijklmnopqrstuvwxyz".match(
new RegExp(`[^${skip}]`, "g")
);
for (const c of s) {
const newIdx = matched.indexOf(c) + index;
ans += matched[newIdx % matched.length];
}
return ans;
};
const matched = "abcdefghijklmnopqrstuvwxyz".match(
new RegExp(`[^${skip}]`, "g")
);
String.match(regexp)
는 정규식 개체를 인자값으로 받아, 문자열이 정규식과 일치하면일치하는 문자열을 첫 번째 요소로 포함하는 Array
를 반환하며, 없으면 null
을 반환한다.[^${skip}]
표현식은 skip
이라는 문자열에 해당하는 문자를 제거한 나머지 문자열을 배열로 반환해준다.matched
는 모든 알파벳 모두 중 걸러야 할 대상인 skip
을 제외한 알파벳이다.for (const c of s) {
const newIdx = matched.indexOf(c) + index;
ans += matched[newIdx % matched.length];
}
for ( a of b )
는 반복가능한 객체 (Array, Map, Set, String 등)의 요소에 대해 실행될 문을 반복한다. 위의 c
는 s
의 요소를 나타낸다.newIdx
는 정규표현식을 통해 걸러낸 matched
내에 c
와 일치한 인덱스와 넘겨야 할 인덱스를 더해준다.newIdx % matched.length
를 통해 나머지 값으로 값을 구한다.정규식도 알고, 인덱스도 알고 있었지만, 이런 식으로 응용할 생각은 못했다.
또한, 문제 이해 능력이 부족했다.
비록 해결하진 못하였지만, 다른 사람의 풀이를 통해 시야가 좀 더 넓어졌고 다양한 응용력을 배운 것 같아 기분이 좋다 👍