프로그래머스: 시저암호

송유나·2021년 1월 18일
0

1. 문제

2. 해결 방법 구상

🌈테스트 케이스: s는"AB", n는 1 이라고 가정
1. s("AB")를 Ascii 코드로 변환해 배열에 담는다
2. 배열 값마다 +n(+1)을 해준다
3. 예외 처리를 해준다(a~z:65~90 / A~Z:97~122 이므로 해당 범위 넘어갈 경우와 공백일 경우의 처리 필요)
4. 배열에 담긴 Ascii 코드를 String으로 변환 후 문자열로 return 한다

3. 코드

function solution(s, n) {
    var answer = '';
    var ascii = []
    
    for(var i=0; i<s.length; i++){	//Ascii변환 후 배열에 담는다	
        ascii.push(s.charCodeAt(i))
    }
    
    ascii = ascii.map((item) => {	//예외처리와 +n 해준다
        return item<92?(item==32?(item):(item+n>=91?(item+n-26):(item+n))):(item==32?(item):(item+n>=123?(item+n-26):(item+n)))
    })
    
  //string으로 변환 후 배열을 문자열로 반환한다
    answer = ascii.map(item => String.fromCharCode(item)).join("")
    
    
    return answer;
}

4. 예외처리

🌈 +n을 한 결과값이 Ascii코드의 알파벳 범위를 벗어난 경우
🌈 공백일 경우
item<92?(item==32?(item):(item+n>=91?(item+n-26):(item+n))):(item==32?(item):(item+n>=123?(item+n-26):(item+n)))

  1. item<92: 대/소문자 구분
  2. item==32: 공백 여부 확인
    2-1. 공백이 맞으면: return item
    2-2. 공백이 아니면: 3번으로
  3. (대문자)item+n>=91 / (소문자)item+n>=123: +n을 했을 때 Ascii 코드의 A~Z / a~z의 범위를 넘어가는지 확인
    3-1. 넘어갈 경우: item+n-26(알파벳이 26개 이므로 한바퀴 빼줘야 함)
    3-2. 넘어가지 않을 경우: item+n

5. 다른 사람의 풀이

  • 아스키코드로 변환하지 않고 쓴 코드 중 가장 깔끔하다고 생각한 코드
  • 난 무조건 아스키코드로 해야겠다라는 생각 뿐이었는데 이렇게 할 수도 있구나라고 생각하게 해 준 코드
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;
}

6. 배운 것

  • charCodeAt(): 해당 인덱스의 문자를 Ascii코드로 변환
    'ABC'.charCodeAt(0); // returns 65
  • fromCharCode(): Ascii코드를 문자로 변환
    String.fromCharCode(65, 66, 67); // "ABC"
  • includes(): 하나의 문자열이 다른 문자열에 포함되어 있는지를 판별하고, 결과를 true 또는 false 로 반환
    'Blue Whale'.includes('blue'); // returns false
profile
개발자를 꿈꾸는 햇병아리입니다.

0개의 댓글