풀이 시간 : 32분 28초
1차 풀이의 실패 이유
- 단순히 code와 code + index 사이에 존재하는 skips의 개수를 계산하는 방식으로 필터 로직을 작성했기 때문에,
skips의 개수에 따라 code + index의 범위가 달라지는 점을 제대로 반영하지 못했습니다.
2차 풀이
- 최종 문자를 한 번에 계산하는 대신,
code의 위치를 한 칸씩 이동하며 범위를 초과하는지와 skips에 포함되는지를 확인하도록 로직을 개선했습니다.
이를 통해 단계별로 처리 과정을 간결하게 작성하여 더 효율적인 코드를 구현할 수 있었습니다.
배운점
1. 복잡한 풀이의 기준은 한번에 한가지 동작 이상의 수행이 필요한 경우
-> 풀이가 복잡해졌다면, 더 간단하게 문제를 정의할 수 있는 것임
-> 해당 풀이를 글로 써보고 더 작은 단위로 나눠서 작성해보기
두 문자열 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
function solution(s, skip, index) {
let answer = "";
const codeA = "a".codePointAt(0); // 시작점
const codeZ = "z".codePointAt(0); // 끝점
const skips = new Set( [...skip].map(char => char.codePointAt(0)) ); // 스킵 문자열들
for(const char of s){
let code = char.codePointAt(0); // 변경전 문자의 유니코드
let steps = 0; // 건너뛴 횟수
while(steps < index){
code ++; // 다음 문자
if(code > codeZ) code = codeA; // 초과시 처리
if(!skips.has(code)) steps++ // skips 가 아닌 문자는 넘어감
}
answer += String.fromCharCode(code); // 최종 문자 추가
}
return answer;
}
// s : 문자열
// skip : 제외해야하는 문자열
// index : 건너 뛰어야하는 값
// want
// 규칙대로 계산한 문자열 반환
// solve
// 1. 알파벳들을 유니코드로 변환해서 처리
// 2. skip 알파벳 중복 되는 경우를 처리하기 위해 Set 으로 선언
// 3. s 문자열을 순회
// 4. 문자열을 옮기고 확인할것 1. z 문자열을 초과햇는지, 2, skip 에 속하는 문자열인지
// 5. index 횟수 만큼 동작 후 문자열 변환 후 반환
// limit
// skip 은 소문자로만, s 포함 X, 중복에 대한 언급 따로 없음 (중복 처리 필요)
// s와 skip 은 소문자로만 이루어짐
해당 문제의 핵심은 알파벳을 최종문자로 효율적으로 변환하는지 입니다.
먼저 알파벳을 유니코드 값으로 변환하여 문제를 단순화하였습니다.
문자를 이동시키면서, z 를 초과하엿는지, skip 의 포함되었는지 여부만 빠르게 확인하여, 최종 문자열을 하는 방식으로 문제를 해결했습니다.