ABOUT ME

작은 디테일에 집착하는 개발자

Today
-
Yesterday
-
Total
-
  • [프로그래머스/JavaScript] 대소문자 바꿔서 출력하기
    IT Study/프로그래머스 2023. 10. 10. 19:14
    728x90

     

    일단 대소문자라고 하니, 영어 아스키코드를 다시 한번 보겠습니다.

    A ~ Z : 65 ~ 90
    a ~ z : 97 ~ 122

     

    자바스크립트에서 아스키코드와 관련있는 메서드에 대해 알아보죠.

    문자 → 아스키 문자열.charCodeAt(인덱스) 문자열에서 인덱스에 해당하는 값을 아스키코드로 변환
    아스키 → 문자 String.fromCharCode(아스키) 해당 아스키코드에 대해 문자로 변환

     

    기본 코드

    const readline = require('readline');
    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
    });
    
    let input = [];
    
    rl.on('line', function (line) {
        input = [line];
    }).on('close',function(){
        str = input[0];
    });

     

    최종 코드

    관련 메서드를 찾아 사용하는 방법을 확인해, 쉽게 풀 수 있었습니다.

    테스트 1 〉통과 (42.62ms, 32.3MB)
    테스트 2 〉통과 (44.16ms, 32.3MB)
    테스트 3 〉통과 (43.43ms, 32.3MB)
    테스트 4 〉통과 (42.87ms, 32.3MB)
    const readline = require('readline');
    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
    });
    
    let input = [];
    
    rl.on('line', function (line) {
        input = [line];
    }).on('close',function(){
        str = input[0];
        // 결과를 담을 변수 result
        let result = ""; 
        
        for(let i = 0; i < str.length; i++) {
            // 문자열.charCodeAt(인덱스) : 문자 > 아스키
            let ascii = str.charCodeAt(i);
            
            if(ascii >= 65 && ascii <= 90) {
                ascii += 32;
            } else {
                ascii -= 32;
            }
            
            // String.fromCharCode(아스키) : 아스키 > 문자
            result += String.fromCharCode(ascii);
        }
        console.log(result);
    });

     

    + 다른 이들의 풀이 중 "가장 가독성이 좋았던" 코드로 풀어본다면 테스트가 얼마나 소요될까요?

    테스트 1 〉통과 (45.33ms, 32.2MB)
    테스트 2 〉통과 (43.52ms, 32.3MB)
    테스트 3 〉통과 (44.81ms, 32.3MB)
    테스트 4 〉통과 (44.78ms, 32.2MB)

    아주 비슷한 시간이 소요되네요.

    그렇지만, 정말 배워야 할 것이 많은 코드입니다. 👍🏻

    (1) `...`를 사용하여 문자 배열로 만들었다는 점
    (2) map 함수와 정규표현식를 사용했다는 점 (루프를 돌릴 필요 없이 한 줄로 처리할 수 있다는 점)
    (3) ES6의 화살표 함수를 통해 모던한 문법을 사용했다는 점
    const readline = require('readline');
    const rl = readline.createInterface({
      input: process.stdin,
      output: process.stdout,
    });
    
    let input;
    
    rl.on('line', (line) => {
      input = [...line];
    }).on('close', () => {
      console.log(
        input.map((char) => (/[a-z]/.test(char) ? char.toUpperCase() : char.toLowerCase())).join(''),
      );
    });
    코드를 파헤져보죠.
    // 배열에 대해 map 메서드를 사용하여 각 문자를 변환
    input.map((char) => (
      // 정규표현식을 사용해 현재 문자(char)가 소문자 알파벳인지 검사
      /[a-z]/.test(char) 
        // 만약 소문자이면 대문자로 변환하여 반환
        ? char.toUpperCase() 
        // 대문자이면 소문자로 변환하여 반환
        : char.toLowerCase()
    )).join(''); // 변환된 문자 배열을 하나의 문자열로 합치기​

     

    /패턴/.test(문자열)

    문자열이 /패턴/ 이라는 정규표현식과 매칭되는지 여부를 검사하여 true나 false를 반환합니다.

     

    배열.join(구분자)

    배열의 각 요소를 지정한 구분자로 연결해 하나의 문자열로 만들어 반환합니다.

Designed by Tistory.