[프로그래머스] 둘만의 암호

butterbeetle·2023년 4월 20일
0

코딩테스트

목록 보기
115/132
post-thumbnail

문제설명

두 문자열 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

입출력 예

sskipindexresult
"aukks""wbqd"5"happy"

내 풀이

function solution(s, skip, index) {
    let answer = "";
    
    for(c of s){
        let asc = c.charCodeAt()
        let helper = 0;
        let cnt = index;
        
        while(cnt > 0){
            helper += 1;
            const trans = (asc-97+helper)%26+97
            if(!skip.includes(String.fromCharCode(trans))) cnt--;
        }    
        
        answer += String.fromCharCode((asc-97+helper)%26+97)
    }
    
    return answer;
}

주어진 sindex 만큼 증가시키되 skip에 있다면 건너뛰어야한다.
보자마자 아스키코드로 하면 되겠구나 생각이났다.

index 만큼 증가시키면서 skip에 포함되는지를 확인해야하는데
z 즉,아스키코드로 122를 넘어가면 123은 { 이므로 다시 a로 되돌아 가야한다.

아래 코드가 이 역할을 해준다.

(asc-97+helper)%26+97

만약 skip에 포함되어 있다면 그 문자는 건너 뛰어야하므로
포함 되지 않을때만 cnt를 감소시켜준다.


다 풀고 다른분 풀이를 보았는데
알파벳 배열을 만들어서 하신분도 계시더라

근데 알파벳은 26개 밖에 안되고
skip에 들어가는 알파벳도 제외되니까 괜찮은 풀이라고 생각이들었다.

창의성이 대단하신거 같다.

profile
멍청이

0개의 댓글

Powered by GraphCDN, the GraphQL CDN