자료구조 및 알고리즘/JavaScript Practice

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

Ryomi 2024. 12. 19. 21:33
728x90
반응형

24년 12월 19일
해결한 문제 갯수: 8

 

문제 설명

 

 

문제 분석

  • 공백은 그대로 유지
  • 알파벳만 이동 (대/소문자 구분)
  • 밀어내는 거리 n은 1 이상 25 이하
  • 문자열 길이는 8000 이하

 

첫 번째 접근 : 문자 코드를 이용한 방법

function solution(s, n) {
    return s.split('').map(el => {
        if(el === ' ') return el
        
        else {
            const target = el.charCodeAt() + n
            const [z, Z] = ['z'.charCodeAt(), 'Z'.charCodeAt()]
            
            if((el === el.toLowerCase() && target > z) || 
               (el === el.toUpperCase() && target > Z)) {
                return String.fromCharCode(el.charCodeAt() + n - 26)
            }
            
            return String.fromCharCode(el.charCodeAt() + n)
        }
    }).join('')
}

 

1) 빈 문자열을 그대로 반환합니다. 

2) charCodeAt()을 사용해 문자를 아스키코드로 변환합니다. 

  • 변환한 코드에 n을 더합니다.
  • 찾고자 하는 아스키 코드를 String.fromCharCode()를 사용해 문자로 변환합니다.

3) 범위 처리

 

  • 소문자 'z'(122)와 대문자 'Z'(90) 초과 시 처리합니다.
  • 알파벳 26자를 고려한 순환 구현합니다.

 

 

두 번째 접근: 문자열 반복을 이용한 방법

function solution(s, n) {
    const upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.repeat(2)
    const lower = upper.toLowerCase()
    
    return s.split('').reduce((answer, l) => {
        if(l === ' ') answer += l
        else if(l === l.toLowerCase()) {
            answer += lower.slice(lower.indexOf(l) + n, lower.indexOf(l) + n + 1)
        }
        else answer += upper.slice(upper.indexOf(l) + n, upper.indexOf(l) + n + 1)
        return answer
    }, '')
}

 

728x90
반응형