알고리즘

[알고리즘]프로그래머스 Lv.1 - 시저암호

로돌씨 2024. 3. 22. 00:17

출처 - https://school.programmers.co.kr/learn/courses/30/lessons/12926

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명

 

나의 풀이

 

function solution(s, n) {
    //아스키코드를 이용해 밀린 값만큼 값을 수정해준다.
    //아스키코드 : A = 65 / Z = 90 / a = 97 / z = 122
    var answer = '';
    for (let i = 0 ; i <  s.length; i ++){
        if (s[i] === " ") {
            answer += " "
        }
        else{
            //s 변수 내에 있는 i의 charCode를 표시해줌
            let charCode = s.charCodeAt(i);
            console.log(charCode)
            // charCode가 대문자일때에 변경후에 90보다 크다면 -26을 해주어 Z였다면 다시 A로 갈수있게 만들어줌
            if(charCode <= 90){
                charCode += n;
                if(charCode > 90){
                    charCode -= 26; 
                }
            }
            else{
                //반복
                charCode += n;
                if(charCode > 122){
                    charCode -= 26
                }
            }console.log(charCode)
            //String.fromCharCode()->아스키코드값을 문자로 변환해줌
            answer += String.fromCharCode(charCode);
        }
    }
    return answer;
}

 

아스키 코드를 이용해 문제를 풀었다 .

아스키 코드를 이용해 푸는 문제가 많으니 각 아스키코드의 알파벳 숫자를 외워 두도록 하자! 

 

다른사람의 풀이

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;
}

아스키코드없이 직접 알파벳배열을 선언해 인덱스 값을 이용하여 풀었다! 깔끔하고 보기도 좋은것같다. 아스키코드가 잘 기억 나지않을때에 사용하여도 좋을것같다. 

그리고 continue를 사용해본적이없는데 continue를 사용하여 결과가 중복되지않게 한 부분도 감명깊다!! 

 

번외

function caesar(s, n) {
    var result = "";
    // 함수를 완성하세요.
    var alphabetArray = ["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",
                       "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",
                       "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",
                       "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",
                       "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",
                       "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",
                       "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",
                       "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",
                       " "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," ",
                       " "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," ",
                       " "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," ",
                       " "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," ",];

    var splitArray = s.split("");
  //indexOf 로 배열에서 인덱스를 알아낸 후 인덱스에 n을 더한다.

    for(var i = 0 ; i < splitArray.length ; i++)
  {
    var mn = alphabetArray.indexOf(splitArray[i]);
    splitArray[i] = alphabetArray[mn+n];

    result = result + "" + splitArray[i];
  }

  return result;
}

너무 멋있는것같다. 열정도 대단하고 나는 생각이안나거나 로직이 안짜이면 금방포기해버릴것같은데 ...

물론 이분은 재미로 하신것같다만 , 이렇게라도 풀려는 노력을 가해야겠다 진짜광기