문제 : 둘만의 암호 LV. 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
입출력 예
s | skip | index | result |
---|---|---|---|
"aukks" | "wbqd" | 5 | "happy" |
내코드
function solution(s, skip, index) {
let skipArray = skip.split('')
let sArray = s.split('')
var answer = '';
answer = sArray.map(res => {
let i = 0
let code = res.charCodeAt()
while(i < index) {
if (!skipArray.includes(String.fromCodePoint(++code)))
i++
if (code === 'z'.charCodeAt() + 1) {
if(skipArray.includes('a'))
i--
code = 'a'.charCodeAt()
}
}
return String.fromCodePoint(code)
}).join('')
return answer;
}
내 코드 리뷰
의도 및 설계
ASCI 코드를 이용해 자연수로 원하는 만큼 조정해서 다시 문자로 돌려 결과를 도출 하려함
s
, skip
문자를 split('')
메서드로 배열로 잘라서 sArray
, skipArray
를 만든 sArray
를 map
으로 반복작업을 시작한다.
map
안에서 sArray
의 각 문자를 ASCI 코드로 변환하고 code
에 담아둔다 이후 반복문 안에 들어와서 1 증가시킨후 다시 문자로 만들어 그 문자가 skipArray
배열안에 속하면 i
를 증가시키지 않고 속하지 않으면 i
를 1 증가 시킴 i
가 index 보다 같거나 커지면 반복문이 끝나고 다음 문자로 진행된다.
이때 z 를 넘어간 ASCI 코드상 'z' + 1
인 상황에 a 로 code
를 변환한다 만약 skipArray
에 'a' 가 포함 된다면 i
를 1 감소시킨다.
보완해야 하는 부분
특정 상황에 대한 로직을 따로 구성해야함
z
를 넘어가는 즉 마지막을 넘어가는 부분에서 다시 a
처음으로 돌아가야한다.
하지만 skip 에 a
및 z
가 속할 경우의 로직이 따로 추가되어야 한다.
위 코드가 프로그래머스에서 통과했지만 skip
에 z
가 속할경우 오류가 예상됨
if 문이 많고 반복된 작업이 효율적이지 못하다
if 문을 많이 사용하지 않고 미리 데이터를 정제해서 처리하면 훨씬 깔끔하고 가독성도 향상될 것
다른 해결 방법
- skip 문자를 뺀 알파벳모음을 만들어 처리
- set 으로 만들어
.delete()
메서드로skip
내용 제외 - 정규식으로 만들어서
match()
메서드로skip
내용 제외
- set 으로 만들어
'코딩 테스트 문제 및 풀이' 카테고리의 다른 글
[JS] 코딩 테스트 문제 : 멘토링 (0) | 2023.10.17 |
---|---|
js 코딩 테스트 : [ 택배 배달과 수거하기 ] (0) | 2023.02.23 |
js 코딩 테스트 : [ 신고 결과 받기 ] (0) | 2023.02.17 |
js 코딩 테스트 : [ 문자열 나누기 ] (0) | 2023.02.16 |
js 코딩테스트 : [ 개인정보 수집 유효기간 ] (0) | 2023.02.15 |