Thief of Wealth

오늘 기이한 경험을 했다.

https://www.acmicpc.net/problem/10825

 

10825번: 국영수

첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 1

www.acmicpc.net

단순 백준 정렬문제를 풀고 있었는데,

시간초과가 발생한 것이다.

 

도저히 시간초과가 발생한 것이 이해되지 않아서 python으로 정답을 빠르게 맞추고 javascript로 풀이한 코드를 보았다.

코드는 비슷했다.

차이가 있다면 한줄 한줄 console.log() 으로 출력한 것이 아니고, 정답값들을 문자열 1개에 모아서 한번에 출력하고 있었다.

나도 for문마다 console.log를 호출하는 것이 아니라, 1번만 호출해보았는데 바로 통과했다.

 

=> 즉, 매 for문 마다 console.log()를 돌리는 것은 비효율적이다!

 

https://stackoverflow.com/questions/2934509/exclude-debug-javascript-code-during-minification

위 링크에도 나와있는데, console.log는 디버깅용으로 쓰는 함수라서 사용할 때 속도가 저하될 수 있다고 한다. :)

 

javascript로 ps를 할 때, 꼭 고려하도록 하자!

 

 

시간초과 코드

const readline = require("readline");
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

const solution = (students) => {
    students = students.map(student => {
        const res = student.split(" ");
        res[1] = parseInt(res[1]);
        res[2] = parseInt(res[2]);
        res[3] = parseInt(res[3]);
        return res;
    });
    students.sort(
        (a, b) => {
            if (a[1] !== b[1]) {
                return -(a[1] - b[1]);
            } else if (a[2] !== b[2]) {
                return (a[2] - b[2]);
            } else if (a[3] !== b[3]) {
                return -(a[3] - b[3]);
            } else {
                if (a[0] < b[0]) {
                    return -1;
                } else if (a[0] > b[0]) {
                    return 1;
                } else {
                    return 0;
                }
            }

        }
    );
    
    for (let i = 0; i < students.length; i++) {
        console.log(students[i][0]);
    }
    
}

const input = [];
rl.on("line", function(line) {
    input.push(line);

}).on("close", function() {
    solution(input.slice(1));
    process.exit();
});

 

통과 코드

const readline = require("readline");
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

const solution = (students) => {
    students = students.map(student => {
        const res = student.split(" ");
        res[1] = parseInt(res[1]);
        res[2] = parseInt(res[2]);
        res[3] = parseInt(res[3]);
        return res;
    });
    students.sort(
        (a, b) => {
            if (a[1] !== b[1]) {
                return -(a[1] - b[1]);
            } else if (a[2] !== b[2]) {
                return (a[2] - b[2]);
            } else if (a[3] !== b[3]) {
                return -(a[3] - b[3]);
            } else {
                if (a[0] < b[0]) {
                    return -1;
                } else if (a[0] > b[0]) {
                    return 1;
                } else {
                    return 0;
                }
            }

        }
    );
    let answer = "";
    for (let i = 0; i < students.length; i++) {
        answer += `${students[i][0]}\n`;
    }
    console.log(answer);
}

const input = [];
rl.on("line", function(line) {
    input.push(line);

}).on("close", function() {
    solution(input.slice(1));
    process.exit();
});

 

 

profile on loading

Loading...