1.백준에서 제로라는 문제를 풀던 도중 push와 pop만으로 문제를 구성하는 것은 뭔가 비효율이 아닐까?라는 시간복잡도를 제출 전 떠올렸다. 이 시점에서 이미 개발자로서 한발자국 더 나아갔다고 생각한다!
그리고 0의 갯수를 따로 저장하는 변수를 설정했지만 잘 생각해보니 result 또한 굳이 배열로 관리할 필요가 있나? 라는 생각이 들었다.
그래서 빈 배열에 i를 push하는 for문을 만들어 돌려봤으나 의외로 엄청 빠른 속도로 처리되어 정확히 시간을 체크하기 힘들었다. 숫자를 천만단위로 올리자 어느정도의 지연이 있는걸 확인하고 5천만회를 돌리자 16.85초가 걸렸다. 이번에는 같은 값들을 문자열로 저장해봤다. 이번에도 천만회에는 큰 지연속도가 없는 것을 확인 후 5천만회를 돌리자 14.19초가 나왔다. 의외로 큰 차이는 없다는 부분에서 조금 실망스러웠다. 오히려 텍스트가 너무 길어서인지 텍스트 용량만 389MB가 나왔다.

배열에 push를 5천만회(0~49999999) 시도하는 경우 = 16.85초
문자열에 +숫자를 5천만회('0'~'499999999') 시도하는 경우 = 14.19초
내용물로 들어갈 글자는 5천만글자가 아닌 한글자이기 때문에 i를 배정해주지 않고 1이라는 특정 숫자를 계속해서 넣어줘보니 push는 이상하게 시간이 더 오래걸려버렸다.
유의미한 차이는 아닌 수동측정에서 발생할 수 있는 오차정도지만 데이터의 길이가 시간에 큰 영향을 주지 못한다는 뜻인 것 같았다.
하지만 문자열에서는 확실히 길이가 큰 차이를 보여줬는데 1씩 5천만회를 더해주자 4.08초밖에 걸리지 않았다.

배열에 push를 5천만회 시도하는 경우 = 17.25초
문자열에 +1을 5천만회 시도하는 경우 = 4.08초
이 부분에서 다시 의문이 생겼다. console.log를 결과값을 받아왔는데 배열은 생략되어 갯수만 출력하지만 문자열은 용량까지 표기될 정도로 덩어리가 크게 나와서인지 시간이 유의미한 차이를 보였기 때문에 콘솔에 시간이 어느정도 차이가 나지 않을까? 그래서 이번에는 console.log는 결과 출력 시간을 알기 위해 "done"을 출력하게 바꾼 후 시도해봤다.
그런데 의아하게도 5천만회의 push또한 console의 출력이 1초도 걸리지 않았다.
이에 의문이 생겨 5천만회의 시행횟수를 다시 증가시켰다. 그러자 페이지가 터져버렸다...
왜 5천만회는 1초도 걸리지 않는데 2억회는 페이지가 터질까? 다시 1억회로 테스트했지만 이번에도 1.15초라는 눈 깜빡할 사이에 끝나버렸다.
결국 정확한 계산을 위해 알아보다가 작동 시간을 측정할 수 있는 방식을 알아냈다.
함수 시행 전 시간과 종료 시점을 컴퓨터에 기록 후 그 값을 출력하는 아래같은 방식이었다.
let start = new Date();
let result = ''
for(let i = 0 ; i <50000000 ; i++){
result += 1
}
let end = new Date();
document.write(end - start);
그리고 다시 시작된 측정에서 push(2)를 1억회 시도하는 것은 0.7초가 걸렸으며
문자열에 2를 1억회 더하는 것은 7.4초가 걸렸다. 아무래도 문자열은 그 자체를 출력해줄 수 있지만 배열은 출력을 하기 위해 뭔가 추가작업이 필요해 그 값을 그대로 출력하려면 대기시간이 처리보다 더 길다고 추측된다.
배열에 push를 1억회 시도하는 경우 = 0.7초
문자열에 +1을 1억회 시도하는 경우 = 7.4초
결론적으로 console을 해주는 과정에서 시간이 오래 걸릴 뿐 push자체는 큰 시간을 잡아먹지 않는다는 사실을 알아냈다.
사실 그냥 문제를 풀었으면 바로 통과했을지도 모르는데 혼자서 시간복잡도를 고려하겠다고 더 오래걸리는 문자열을 넣어서 이상한 고민을 한 것 같다.

그리고 안타깝게도 예상대로 배열로만 문제를 처리하자 제한시간보다 5배나 빠르게 종료되어 문제와 상관없는 고민을 한 것으로 밝혀졌다.
하지만 테스트를 한 경험을 바탕으로 더 최적화에 대해 고민해보는 시간을 종종 가져봐야겠다.
클로저나 서버부분은 딱히 회고할 부분이 없어 문제를 풀다가 의문이 생긴 부분에 대해 정리했다.
'회고' 카테고리의 다른 글
| [사용자 친화 웹] UI/UX (0) | 2022.06.27 |
|---|---|
| 학습(CRUD-Sever,React연동) (0) | 2022.06.26 |
| [자료구조/알고리즘] 재귀-2 (0) | 2022.06.24 |
| [자료구조/알고리즘] 재귀 (0) | 2022.06.23 |
| 프론트엔드 부트캠프(코드스테이츠) 2개월차 회고 (0) | 2022.06.22 |
