티스토리 뷰

728x90
반응형

목차

     

    문제

     

    문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 

    즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다. 

    S에는 QR Code "alphanumeric" 문자만 들어있다.

    QR Code "alphanumeric" 문자는 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\$%*+-./: 이다.

     

    입력

     

    첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1,000)가 주어진다. 

    각 테스트 케이스는 반복 횟수 R(1 ≤ R ≤ 8), 문자열 S가 공백으로 구분되어 주어진다. 

    S의 길이는 적어도 1이며, 20글자를 넘지 않는다. 

     

    출력

     

    각 테스트 케이스에 대해 P를 출력한다.

     

    풀이

     

    처음에는 아무 생각도 없이 반복문을 삼중으로 만들어서 문제를 풀었다.

     

    테스트 케이스의 개수와 반복 횟수가 크지 않아 딱히 성능에는 문제가 없으니 그냥 넘어갈까 했지만,

     

    검색을 해보니, JS에도 repeat() 메서드가 있었다!

     

    그래서 주어진 r 만큼 반복하는 작업을 repeat 함수로 대체하고 반복문을 이중으로 줄였는데..

     

    이상하게도 이전 코드와 성능차이가 거의 나지 않았다.

     

    아니 오히려, 처음의 삼중 반복문 코드가 미세하게 빨랐다!

     

    생각보다 흥미로운 것 같아서 조금 검색을 해보니, 문제는 repeat 함수에 있는 듯했다.

     

    repeat 함수는 호출될 때마다 내부적으로 메모리를 할당하고, 문자열을 생성하고, 결과를 반환하는 작업을 수행하기 때문에

     

    오버헤드가 발생하고, 이는 테스트 케이스와 반복 횟수가 커질수록 증가한다고 한다.

     

    반면 삼중 반복문에서는 문자를 반복문으로 그때그때 더해주기만 하기 때문에, 함수 호출에 의한 오버헤드보다 성능이 좋은 것이다.

     

    이는 r과 s의 길이가 커질수록 (테스트는 못 했지만) 더 티가 날 것으로 예상되며,

     

    다중 반복문이 꼭 성능이 떨어진다고는 말할 수 없다는 예로서 기억될 것 같다.

     

    파이썬이었다면 문제가 달랐을지도 모르지만..

     

    문제를 푸는 알고리즘은 코드로 대체한다. 사실 별 어려운 문제가 아니다.

     

    JavaScript_Triple Loop

     

    const rl = require('readline').createInterface({
        input: process.stdin,
        output: process.stdout,
    });
    
    let t = 0;
    let input = [];
    
    rl.on('line', (line) => {
        if (t === 0) {
            t = Number(line);
        } else {
            input.push(line.split(' '));
        }
    }).on('close', () => {
        for (let i = 0; i < t; i++) {
            let r = Number(input[i][0]);
            let s = input[i][1];
            let result = '';
    
            for (j = 0; j < s.length; j++) {
                for (k = 0; k < r; k++) {
                    result += s[j];
                }
            }
    
            console.log(result);
    
            rl.close();
        }
    });

     

    JavaScript_Double Loop with repeat()

     

    const rl = require('readline').createInterface({
        input: process.stdin,
        output: process.stdout,
    });
    
    let input = [];
    
    rl.on('line', (line) => {
        input.push(line);
    }).on('close', () => {
        const t = Number(input[0]);
    
        for (let i = 1; i <= t; i++) {
            const [r, s] = input[i].split(' ');
    
            let result = '';
    
            for (let j = 0; j < s.length; j++) {
                result += s[j].repeat(Number(r));
            }
    
            console.log(result);
    
            rl.close();
        }
    });

     

    Performance

     

    반응형
    댓글
    공지사항
    최근에 올라온 글
    최근에 달린 댓글
    Total
    Today
    Yesterday
    링크
    «   2024/06   »
    1
    2 3 4 5 6 7 8
    9 10 11 12 13 14 15
    16 17 18 19 20 21 22
    23 24 25 26 27 28 29
    30
    글 보관함