문제 상황
로직 자체는 간결하게 작성한 것 같으나 제출한 코드가 시간 초과로 통과되지 않았습니다.
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. 테스트 결과 추가
'크고 작은 문제들 > 어려움' 카테고리의 다른 글
[TypeScript] 배열 요소에 대한 타입 추론 (0) | 2023.08.17 |
---|---|
[React] JavaScript로 작성된 카카오 지도를 TypeScript로 포팅하기 (0) | 2023.08.03 |
[Ubuntu] Window에서 열리는 VS Code (0) | 2023.07.08 |
[npm] nvm으로 node.js 버전을 설치하였으나 다시 켤 때마다 npm을 찾지 못하는 오류 (0) | 2023.06.26 |
[React + Jest] 두 번째 테스트 케이스부터 컴포넌트를 찾을 수 없는 문제(자동 cleanup) (0) | 2023.06.13 |