크고 작은 문제들/어려움

[node.js] 백준 문제풀이 시간초과(console.log)

노새두마리 2023. 6. 17. 03:35

문제 상황

로직 자체는 간결하게 작성한 것 같으나 제출한 코드가 시간 초과로 통과되지 않았습니다.


 

글 읽기 - [node.js] 10828번 - 스택 / 시간초과

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

console.log를 호출하는 횟수가 늘어날 수록 프로그램 실행 시간이 급격하게 늘어납니다.

따라서, 배열에 모든 결과를 저장해 두었다가 배열을 join하여 하나의 문자열로 만든 뒤, console.log를 한 번만 호출하여 해결하는 것이 핵심입니다.

const result = [];
// ... result.push()로 결과 저장
console.log(result.join('\n'));

console.log 호출 횟수에 따라 실행 시간에 큰 차이가 발생한다는 사실만 보면 되므로 간단하게 1회만 테스트하도록 하겠습니다. N마다 1000번 반복하여 평균 실행 시간을 구하는 중에 크롬 브라우저 탭이 멈춰서 수정중인 글을 날렸습니다.

const N = 100;

console.time('test');
for (let i = 0; i < N; i++){
    console.log(i);
}
console.timeEnd('test');
const N = 100;

console.time('test');
const result = [];
for (let i = 0; i < N; i++){
    result.push(i);
}
console.log(result.join('\n'));
console.timeEnd('test');
  N = 100 N = 1000 N = 10000
A: console.log(i) * N 1.678ms 13.470ms 129.865ms
B: console.log(result.join('\n')) * 1 0.089ms 0.190ms 0.948ms
A / B 18.85배 70.89배 136.99배

N의 값이 커질수록 실행 시간의 차이는 더욱 커지는 것을 확인할 수 있습니다.


시간 초과에서 벗어나기 위한 몸부림 기록

1. 답을 찾을 때마다 console.log 호출 → result에 저장한 뒤 join하지 않고 forEach문으로 console.log 호출

console.log 호출 횟수가 동일하여 문제가 해결되지 않았습니다.

 

2. result에 저장된 결과를 join하여 하나의 문자열로 만든 뒤 console.log를 한 번만 호출

시간 초과가 해결되었습니다.

 

※ console.log 호출 횟수 줄였음에도 시간 초과가 발생한다면 시간 복잡도 측면에서 개선하여야 합니다...!


스스로 로직을 간결하게 작성하였다고 생각한 과거의 자신을 반성하였습니다.


수정 로그

  • '24. 01. 08. 테스트 결과 추가