[js]프로그래머스 시저암호

이명진·2023년 1월 12일
0

코드카타

목록 보기
56/69

문제 요약

주어진 string 알파벳에 숫자가 주어지고 숫자만큼 알파벳을 민다. A ,1 이라면 B로 숫자를 미는 것이다.
단 공백이 주어지면 공백은 아무리 밀어도 공백이다.
대문자일 경우 대문자로 밀고 소문자일 경우 소문자로 민다.
대소문자만 없으면 간단하게 풀수 있을것 같은데 나뉘어져 있어서 같은 식을 반복하여 작성하게 되었다.

나의 풀이

나의 풀이는 이렇다 .

function solution(code,n){
   let answer = ''
   const Alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
  let codeArr = code.split('');
 answer = codeArr.map(x=> {
   let codeToNum = ''
    if(x == ' '){
         return codeToNum = ' '
      }
     codeToNum = Alphabet.findIndex((y)=>{return y === x})
    if(codeToNum === -1){
      x = x.toLowerCase()

      codeToNum = Alphabet.findIndex((y)=>{return y === x})
             codeToNum += n;

       if(codeToNum>=26){
     codeToNum -= 26

   }
    codeToNum= Alphabet[codeToNum]

    codeToNum= codeToNum.toUpperCase()
    }else{
        codeToNum += n;
       if(codeToNum >= 26){
     codeToNum -= 26
   }
         codeToNum= Alphabet[codeToNum]
    }



   return codeToNum
  })


   return answer.join('')
 }

map을 이용하여 풀게 되었다. 처음에 그냥 charAt을 쓰고 풀려다가 map으로 풀수 있을것 같아서 map으로 바꾸어서 풀었다.

다른사람의 풀이

다른 사람의 풀이 이다.

`
function solution(s, n) {
    var upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    var lower = "abcdefghijklmnopqrstuvwxyz";
    var answer= '';

    for(var i =0; i <s.length; i++){
        var text = s[i];
        if(text == ' ') {
            answer += ' '; 
            continue;
        }
        var textArr = upper.includes(text) ? upper : lower;
        var index = textArr.indexOf(text)+n;
        if(index >= textArr.length) index -= textArr.length;
        answer += textArr[index];
    }
    return answer;
}
`

여기서 훑어 보다가 string도 []로 각 값들을 접근할수 있다는 것을 처음알게 되었다.
string값들을 가져오기 위해서 나는 split으로 배열로 각각 만들어서 접근을 하였는데
바로 접근이 가능하였다. 이것만 알아도 한두줄 정도는 코드는 줄일수 있을 것 같다.
나는 배열이라서 filter()를 사용하였고 이 분은 includes 함수를 사용하였다.

나는 소문자 알파벳들만 정의를 해놓아서 소문자로 바꾸고 대문자로 변경하고 했는데
기존에 대 소 문자 둘다 정의를 해놓았으면 바꾸는 코드가 필요 없을것 같다.

그래서 아래처럼 내 코드를 수정해 봤다.

function solution(code,n){
   let answer = ''
   let SmallAlphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
   const BigAlphabet = ['A','B','C','D','E','F','G','H','I','J','K','L',"M",'N','O','P','Q','R','S','T','U','V','W','X','Y','Z']

  let codeArr = code.split('');
 answer = codeArr.map(x=> {
   let codeToNum = ''
    if(x == ' '){
         return codeToNum = ' '
      }
    Alphabet = SmallAlphabet
     codeToNum = Alphabet.findIndex((y)=>{return y === x})
    if(codeToNum === -1){
      Alphabet = BigAlphabet
      codeToNum = Alphabet.findIndex((y)=>{return y === x})

    }
          codeToNum += n;
       if(codeToNum >= 26){
     codeToNum -= 26
   }
         codeToNum= Alphabet[codeToNum]
  
   return codeToNum
  })
  

   return answer.join('')
 }

대문자를 정의해 주고 로직을 돌렸는데 성능상 큰 차이는 없는것 같다 (테스트 속도가 비슷하다. 수정전이 좀더 빠른것 같기도 하다 )

오늘도 한문제 해결

profile
프론트엔드 개발자 초보에서 고수까지!

0개의 댓글