onsil   5년 전

궁금한 코드는 총 3개 입니다.

첫번째 코드는 문제에 설명된 대로 구현한 코드입니다.

f8e8c9df-b11d-4104-9814-72e839d4ff93

이 코드의 실행결과는 88MS가 나왔습니다.

 

두번째 코드는 첫번째 코드의 8~9번 줄을 줄인것입니다. 나머지 코드는 동일합니다.

673adc19-fe99-47de-bb39-453002c4efa5

이 코드의 실행결과는 92MS 입니다.

첫번째 궁금증이 여기서 나옵니다.

첫번째 코드는 배열을 선언하고, 또 그 배열을 돌면서 값을 새로 정의해준것이고

두번째 코드는 배열을 선언과 동시에 원하는 값으로 선언해준것인데

왜 두번째 코드가 시간이 더 오래걸린 것인지 이해가 되지 않습니다...ㅠㅠ

 

세번째 코드는 문제에서 설명된대로 코딩한게 아니라 야바위 방식으로 코딩을 했습니다.

80e7d84a-c264-40cd-8c52-bcb6f39a7178

이 코드의 실행시간은 88MS로 첫번째 코드와 실행시간이 같습니다.

두번째 궁금증이 여기서 나옵니다.

첫번째 코드는 매 컵을 옮길때마다 getPos()메소드가 두번씩 실행되서 배열 전체 탐색을 두번씩 해야하고

세번째 코드는 마지막에 공이 들어간 컵을 찾을 때 딱 한번 배열 전체 탐색을 합니다.

그래서 제 생각으로는 세번째 코드가 첫번째 코드보다 당연히 실행시간이 훨씬 빨라야한다고 생각하는데요...

똑같이 나와서 당황스럽네요..

 

이 두가지 궁금증을 해결하고 싶습니다...

djm03178   5년 전

자바는 기본적으로 프로그램을 켰다 끄는 데에만 그 88MS 정도가 걸립니다. 이 문제는 제한이 너무 작아서 실제 프로그램의 본문은 1MS보다 한참 아래에 끝이 날 수 있고, 그보다는 그 프로그램을 켜고 끄는 데에 걸리는 시간의 오차에 의해 4MS의 차이가 났을 가능성이 높습니다.

djm03178   5년 전

자바 프로그램의 수행 속도를 간략하게 제시해 드리자면, 1초에 약 1억 개의 문장을 실행할 수 있습니다. 물론 그 문장이 실제로 얼마나 무거운지에 따라서 달라지기는 합니다. 그래서 N=50 정도로는 O(N)이든, O(N^2)이든 거의 아무런 차이가 없습니다. 심지어 O(N^3)이라도 체감할 수 없을 정도로 짧은 시간이 걸립니다.

onsil   5년 전

그러면 제 두가지 생각

  1. 배열을 for문으로 돌린것보다 선언과 동시에 값을 지정해주는게 더 빨라야하는 것
  2. 첫번째 코드보다 세번째 코드가 더 빨라야한다는 것

이 두가지 생각이 이론적으로는 옳은건가요?

djm03178   5년 전

  1. 아마 내부적으로 약간 더 빠를 것 같기는 합니다만, 시간복잡도상으로는 같기 때문에 기껏해야 몇 배 정도의 차이일 것 같습니다. 한 0.000001MS 정도 더 빠를까요.
  2. 효율성 면에선 그렇긴 하겠죠. 매 루프마다 배열 6개 원소씩을 더 탐색하는 거니까요. 하지만 컵의 수가 상수라서 역시 시간복잡도에는 차이가 없고, 몇 배 정도의 차이 정도만 있을 것 같습니다. 그래봐야, 0.003MS 걸릴 걸 0.001MS로 단축시켰다 정도입니다.

onsil   5년 전

친절한 답변 정말 감사합니다.

많이 배웠습니다~

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