728x90
JavaScript로 백준 문제를 풀 때 console.log()를 사용하면 시간 초과가 나는 이유
JavaScript로 알고리즘 문제를 풀 때, 특히 백준에서 console.log()를 반복적으로 사용하면 시간 초과(Time Limit Exceeded, TLE)가 발생하는 경우가 많습니다. 그 이유와 해결책을 아래와 같이 정리합니다.
1. 문제의 원인: console.log()는 느린 입출력 방식이다
JavaScript의 console.log()는 본래 개발자 도구용 디버깅 함수입니다. 출력 최적화를 목적으로 설계된 것이 아니라, 가독성과 유연함에 초점이 맞춰져 있습니다.
- 각 console.log() 호출 시 내부적으로
- 출력 스트림 처리
- 문자열 변환 및 줄바꿈 처리
- flush(출력 버퍼 비우기) 수행 등 부가 비용 발생
결과적으로 수천~수만 번의 호출이 누적되면 출력 처리 자체가 병목이 됩니다.
2. 대표적인 예시 (비효율적인 출력 방식)
for (let i = 1; i <= 100000; i++) {
console.log(i); // 시간 초과 발생 가능
}
위처럼 10만 번의 console.log() 호출은 각 줄마다 출력 시스템을 호출하므로 매우 느립니다.
3. 해결책: 출력을 모아서 한 번에 처리하기
출력 내용을 배열에 모은 뒤, 한 번만 출력
let arr = [];
for (let i = 1; i <= 100000; i++) {
arr.push(i);
}
console.log(arr.join('\n')); // 단 한 번만 출력
- join('\n')으로 줄바꿈 포함된 하나의 문자열 생성
- console.log()는 단 한 번만 호출 → 시간 초과 방지
4. 그 외 대안
방법 설명
console.log() | 디버깅에는 좋지만 반복 호출 성능은 나쁨 |
process.stdout.write() | 더 빠르지만 줄바꿈과 형식 처리가 번거로움 |
join + 1회 출력 | 가장 깔끔하고 실용적인 방식 |
5. 실전 팁: 언제 이 방식이 필요한가?
- DFS, BFS, 구현 문제 등에서 많은 수를 출력할 때 (O(N) 이상의 출력)
- 특히 결과가 한 줄씩 출력될 때는 반드시 출력 모아서 처리할 것
- 입력 처리 최적화(readFileSync)와 함께 쓰면 훨씬 안정적
요약
원인 | console.log()는 호출마다 출력 시스템 부하가 큼 |
증상 | 반복 출력 시 시간 초과 (TLE) 발생 |
해결 | 출력을 배열에 모은 후 join('\n')으로 한 번에 출력 |
백준에서는 console.log()를 남용하지 마세요. 출력도 알고리즘의 일부입니다.
반응형
'언어 · 런타임' 카테고리의 다른 글
[Node.js] dependencies vs devDependencies – 실무에서 헷갈리지 않기 (1) | 2023.12.20 |
---|