프로그래머스 코딩테스트 (1) - 둘만의 암호

박규범·2023년 2월 25일
1
post-thumbnail

📖 문제 설명

두 문자열 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 등)의 요소에 대해 실행될 문을 반복한다. 위의 cs의 요소를 나타낸다.
  • newIdx는 정규표현식을 통해 걸러낸 matched 내에 c와 일치한 인덱스와 넘겨야 할 인덱스를 더해준다.
  • 알파벳 z를 넘길 경우 다시 a 로 돌아와야하기 때문에, newIdx % matched.length를 통해 나머지 값으로 값을 구한다.

😀 TIL

정규식도 알고, 인덱스도 알고 있었지만, 이런 식으로 응용할 생각은 못했다.
또한, 문제 이해 능력이 부족했다.
비록 해결하진 못하였지만, 다른 사람의 풀이를 통해 시야가 좀 더 넓어졌고 다양한 응용력을 배운 것 같아 기분이 좋다 👍

profile
즐겁게 코딩합시다 😀

0개의 댓글