끄적끄적 코딩
728x90

문제 설명

주어진 문자열 s의 각 문자에 대해 index만큼 뒤의 알파벳으로 변경하는 규칙을 따릅니다. 단, 특정 문자들은 skip 목록에 포함되어 있으며, 이 문자들은 건너뛰고 세어야 합니다. z를 넘어갈 경우 다시 a부터 순환합니다.


제한 사항

  • s의 길이는 5 이상 50 이하입니다.
  • skip의 길이는 1 이상 10 이하이며, 소문자로만 구성됩니다.
  • s와 skip은 중복되지 않는 소문자로만 이루어져 있습니다.
  • index는 1 이상 20 이하입니다.

해결 방법

알고리즘: 문자열 처리, 리스트 순환

  1. skip에 포함되지 않은 유효한 알파벳 목록을 생성합니다.
  2. 문자열 s의 각 문자에 대해 유효한 알파벳 목록에서의 위치를 찾습니다.
  3. index만큼 이동한 위치의 문자를 결과 문자열에 추가합니다.
  4. 이동 시 리스트 순환을 고려하여 modulo 연산을 활용합니다.

시간 복잡도

  • O(NM) (N: 문자열 길이, M: 유효한 알파벳 수)
    각 문자를 탐색하고 리스트에서의 인덱스를 찾는 과정이 포함되므로 O(NM)의 시간 복잡도를 가집니다.

구현 코드

function solution(s, skip, index) {
  let answer = "";
  let skipSet = new Set(skip);

  let validChars = [];
  for (let i = 0; i < 26; i++) {
    let char = String.fromCharCode(i + 97);
    if (!skipSet.has(char)) validChars.push(char);
  }

  for (let c of s) {
    let idx = validChars.indexOf(c);
    let newIdx = (idx + index) % validChars.length;
    answer += validChars[newIdx];
  }

  return answer;
}

검색 태그