• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    해결됨

"11번) 숫자의 총 개수(small)" 에 관해 질문있습니다! (실행시간측정관련)

22.01.10 17:08 작성 조회수 195

0

문제11번) 숫자의 총 개수(small)

의 강좌속에서, 김태원선생님께서 문제11번 처럼 코드를 작성하게 된다면, 자연수N의 크기가 너무 커졌을때, time limit가 발생한다고 하셨습니다. 그리고 " 제 컴퓨터로 만약 10억까지 숫자를 키워서 실행시킬경우, 25초, 26초 정도 걸리더라고요" 라고 수업시간에 말씀하셨습니다.

 

그래서 저는 직접! 제가 코드에서 시간을 측정하고 싶어서, 구글 검색을 해봤더니, time.h 헤더파일을 이용하면, 실행시간을 측정할 수 있다는 글을 보고, 제가 코드에 적용해보았습니다.

다음은 제가 작성한 코드를 붙여놓기 해놨습니다!

---------------------------------------------------------------------------------------------------------------------

#include <stdio.h>

#include <time.h> // 실행시간을 측정하기 위한 헤더파일

 

int main(int argc, char* argv[]) {

clock_t start, finish;

int N;

int cnt = 0; // 숫자의 총 개수세는용

float time;

 

start = clock(); // 시간 측정 시작

 

scanf("%d", &N); // 자연수N 입력

 

for (int i = 1; i <= N; i++) {

int save = i; // 원본i의 값이 바뀌면 안되서, 일단 숫자 복사해놓기

while (save > 0) {

cnt++;

save = save / 10;

}

}

printf("%d\n", cnt);

 

finish = clock(); // 시간 측정 종료

time = (float)(finish - start) / CLOCKS_PER_SEC;

 

printf("시간측정: %f\n", time);

return 0;

}

-------------------------------------------------------------------------------------------------------------------

돌려보았더니, 시간이 8초정도 나왔습니다.

저는 scanf로 사용자로부터 입력받기 전부터 시간측정을 시작하는걸로 코드를 작성하였는데,

하다보니 궁금증이 생겼습니다.

시간측정을 어느순간부터 시작해서 언제 시간측정을 끝내야 되는건가요?

강사님께서는 25초 정도 나왔다는데, 왜 저는 8초정도 나왔을까요??

정말정말 너무 궁금합니다 ㅠㅠㅠㅠㅠㅠ

답변해주시면 감사하겠습니다!

답변 1

답변을 작성해보세요.

0

RON님의 프로필

RON

2022.01.13

틱계산을 하실거면 키보드로부터 입력받기전부터 start를 입력받으시면 안되고 계산을 시작하는 for문 위부터 측정 하시면됩니다.

컴파일 시간이 오래걸리냐 적게 걸리냐는 컴퓨터 사양에따라서 천차만별입니다. 컴 사양에따라 게임 로딩 속도가 달라지는 것처럼 생각하시면 됩니다. 요즘 컴퓨터로는 대부분 간단한 로직에서 1~2초이상 걸리면 매우 느린편입니다. 이런 경우에는 대부분 알고리즘을 다시 짜야합니다.

SEO님의 프로필

SEO

질문자

2022.01.14

친절한 답변 감사합니다!!

혹시 강사님께서 제공해주신 채점파일을 이용해서 시간측정을 하는것이 아닌,

혼자서 시간측정을 하려면 제가 위에서 한 방법밖에 없나요?

제가 사실 코딩초보라서 그런 시간 측정관련된걸 어떻게 해야되는지 자세히 모릅니다 ㅠㅠㅠ

혹시 다른 좋은 시간측정 방법이 있나요??

RON님의 프로필

RON

2022.01.17

시간측정 하는방법은 하고계시는 방법이 맞습니다.

혹시 제한시간 1초 라는 말때문에 시간 측정을 신경쓰시는 거면 신경쓰지 않으셔도 됩니다.

중요한건 무리하게 반복문을 돌면서 단순계산으로 일일히 비교및 연산하는 알고리즘인 것인가,

아니면 같은 답을 내놓더라도 어떠한 수학 공식을 대입했다거나 STL을 적절히 사용하여 연산하는 횟수자체를 효율적으로 줄인 것인가에 중점을 두시면 됩니다.

계속 프로그래밍을 공부하시면 아시겠지만 어떤 분야이든간에 최소한의 비용으로 최대의 연산효율을 뽑지않으면, 수천, 수만, 수십만 줄의 코드를 처리해야할때, 같은 답을 내놓더라도 어마어마한 속도 차이가 납니다.

어처피 컴파일 속도는 컴퓨터마다 다 다르기때문에 극단적으로 말하자면, 질문자님의 컴퓨터에서 1초가 나왔더라도 다른사람 컴퓨터에서는 5초가 걸릴수도 있습니다. 

때문에 시간 측정은 신경쓰지 않으셔도되고, 이 강좌의 컨셉은 어떻게 해야 효율좋게 이러한 문제를 풀수 있는지에 대한 알고리즘에 대해서 알려주는 내용이 주 이기때문에, 거기에 초점을 두시면 되지 않을까 하는 제 의견 입니다.

SEO님의 프로필

SEO

질문자

2022.01.18

정말 정말 감사합니다! 진짜 물어볼 분 이 주변에 없었는데, 단한번에 궁금한게 해결되었습니다!!!