본문 바로가기
코딩 테스트 문제 및 풀이

js 코딩테스트 : [ 둘만의 암호 ]

by spare8433 2023. 2. 15.

문제 : 둘만의 암호 LV. 1

문제 설명

두 문자열 sskip, 그리고 자연수 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"가 됩니다.


두 문자열 sskip, 그리고 자연수 index가 매개변수로 주어질 때 위 규칙대로 s를 변환한 결과를 return하도록 solution 함수를 완성해주세요.




제한사항


  • 5 ≤ s의 길이 ≤ 50
  • 1 ≤ skip의 길이 ≤ 10
  • sskip은 알파벳 소문자로만 이루어져 있습니다.
    • 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 를 만든 sArraymap 으로 반복작업을 시작한다.


map 안에서 sArray 의 각 문자를 ASCI 코드로 변환하고 code 에 담아둔다 이후 반복문 안에 들어와서 1 증가시킨후 다시 문자로 만들어 그 문자가 skipArray 배열안에 속하면 i 를 증가시키지 않고 속하지 않으면 i 를 1 증가 시킴 i 가 index 보다 같거나 커지면 반복문이 끝나고 다음 문자로 진행된다.


이때 z 를 넘어간 ASCI 코드상 'z' + 1 인 상황에 a 로 code 를 변환한다 만약 skipArray 에 'a' 가 포함 된다면 i 를 1 감소시킨다.


보완해야 하는 부분


특정 상황에 대한 로직을 따로 구성해야함


z 를 넘어가는 즉 마지막을 넘어가는 부분에서 다시 a 처음으로 돌아가야한다.

하지만 skip 에 az 가 속할 경우의 로직이 따로 추가되어야 한다.

위 코드가 프로그래머스에서 통과했지만 skipz 가 속할경우 오류가 예상됨

if 문이 많고 반복된 작업이 효율적이지 못하다


if 문을 많이 사용하지 않고 미리 데이터를 정제해서 처리하면 훨씬 깔끔하고 가독성도 향상될 것


다른 해결 방법


  1. skip 문자를 뺀 알파벳모음을 만들어 처리
    • set 으로 만들어 .delete() 메서드로 skip 내용 제외
    • 정규식으로 만들어서 match() 메서드로 skip 내용 제외