mhkim4886   7년 전

여기는 두 개의 코드를 올리는게 안되는거 같아서.. 링크로 대신할게요.


둘 다 4673번에 대한 풀이이고, 답은 같습니다. 근데 파이썬 코드는 3.78sec가 걸리고, C 코드는 0.2초 걸리는걸로 나오네요. 메모리 사용량도 파이썬이 세 배쯤 많습니다.

파이썬이 C보다 느림은 알고 있는데, 같은 알고리즘으로 짰는데도 이렇게까지 차이가 날 수 있나요..?

bupjae   7년 전

저 차이는 알고리즘이 아니라 언어의 특성 때문에 생기는 문제입니다.

언어를 지원하기 위한 가장 기본적인 라이브러리의 크기가 크게 차이가 나기 때문입니다.


참고로 BOJ에서는 이런 언어의 차이를 보정하는 방안으로 Python 계열로 제출하는 답안에 대해서는 실행시간 +10초, 메모리 +512MB 의 여유를 줍니다.

mhkim4886   7년 전

이렇게까지 차이가 나는군요ㅠㅠ 감사합니다.

chogahui05   7년 전

코드를 조금만 바꾸면 c언어 같은 경우, 3476KB에서 2176KB로 낮출 수 있습니다.

c 배열을 함수 d 내에 선언하지 않고 전역변수로 선언한다면..

파이썬 같은 경우, 동적 타입 언어라서 그런 것도 있고요.

n을 string (List)으로 변환하고, 이렇게 변환한 것을 가지고 다시 int형으로 다시 변환하니 시간이 더 걸리지요.



chogahui05   7년 전

mk님 코드를 optimize 한 결과..

6.1초에서 0.7초로 줄었습니다. 이 과정에서 제가 한 일은


(1) int형에서 String List 형으로 convert하는 것, 그리고 다시 String List형을 int 형으로 Convert하는 연산을 하지 않은 것.

(2) 이미 자릿수 합이 계산된 숫자는 더 이상 계산하지 않게 한 것.

이미 자릿수를 계산한 경우, 또 계산하는 건 낭비거든요.

(3) d(n)을 한 것이 셀프 넘버면 더 이상 탐색을 하지 않고 break를 건다.


(3)까지 한 게 이 코드입니다.

https://ideone.com/SrE2dv


이렇게 하면 3.x초에서 0.07초로 단축시킬 수 있겠네요.

mhkim4886   7년 전

아아.. 자릿수를 저렇게 쉽게 더할 수 있었네요(..) 왜 생각을 못 했지...

type converting이 시간을 정말 많이 낭비하네요. 파이썬은 코딩할때 세세한 최적화도 생각해가며 해야겠습니다. 감사합니다!

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