sosu 문자열을 계속 쌓는게 아니라 현재 소수n번째가 무슨 숫자인지 저장해도 상관없었군요... 뻘질문을 쓴거에 굉장히 부끄럽군요...
그런데 문자열에 문자를 붙이는게 그 문자의 크기가 커지면 시간도 선형으로 늘어나는 이유가 뭔가요?
당연히 이럴때 무조런 시간복잡도 O(1) 인줄 알았는데 말이에요...
1312번 - 소수
python string의 + 연산은 객체 전체를 내부적으로 복사해서 메모리에 저장한 후 합치는 연산을 수행하기 때문에 문자열의 길이만큼 연산을 진행합니다.
그래서, 이를 좀 더 내부적으로 효율적으로 수행해주는 join method를 활용하면 O(1)에 이가 수행되고, 아래 코드처럼 AC를 받게 됩니다.
http://boj.kr/9a18f44bd3d94d3b...
공유하신 코드의 9번줄과 질문자님의 코드의 9번줄의 결과는 전혀 다릅니다.
str.join은 iterable 객체를 인자로 받아서, 그 인자들 사이에 str을 삽입하여 하나의 문자열로 반환합니다. ex) 'ab'.join('cde') ==> 'cabdabe'
공유하신 코드에서는 sosu = sosu.join(str(mok))의 꼴로 쓰셨는데, 여기에서 mok은 항상 0이상 9이하의 정수이므로, 사실상 sosu = str(mok)과 같은 코드입니다.
실제로 아래와 같은 입력에서 sosu 전체를 출력해보시면 질문자님의 코드에서는 전체 몫들이 저장되어있는 반면, 공유하신 코드는 마지막 결과만이 저장되어 있는 것을 확인하실 수 있습니다.
댓글을 작성하려면 로그인해야 합니다.
qusworud 2일 전
많은 분들께서 '초등학교때 배운 나눗셈 과정을 생각해봐라'
를 듣고 나머지에 10을 곱하고 나눈 몫을 적고 남은 나머지에 다시 10을 곱하고
이런식으로 해도 시간초과를 받네요
2초안에 1백만 자리까지는 반복문 n번 반복이니까
O(N)으로 거뜬하다 생각했는데
어느 부분이 시간을 많이 잡아먹을까요?