kckc0608   2년 전

리스트를 쓰니 1.7초만에 통과하고 셋을 쓰니 5.6초정도가 걸리면서 아슬아슬 통과하는데 이유가 궁금합니다.

진입차수의 개수를 어떻게 셀지 고민하다가 from_count 라는 진입차수의 개수를 저장하는 배열(처럼 활용한 리스트)을 이용했습니다.

저는 이미 제거한 정점까지 반복해서 세기보다 set 을 이용해서 이미 센 정점을 제거하고 세는 게 더 빠를 것 같다고 생각해 셋을 이용해 남아있는 정점들을 순회하도록 했는데, 이렇게 하니까 이미 제거한 정점까지 반복해서 셀 때보다 오히려 더 시간이 오래 걸리더라구요

또, 문제 입력에 아무런 조건이 없어서, 동일한 입력이 여러번 주어질 수도 있다는 생각에 셋을 써서 동일한 입력에 대해 중복값을 없애고자 생각한 점도 그래프 리스트에 셋을 쓴 이유였습니다.

set의 remove 메소드 시간복잡도도 O(1)로 나오는데 어째서 더 시간이 많이 걸리는 것인지 궁금합니다.

(set 풀이에서, remove_list 를 쓴 이유는 셋을 순회하는 중, 셋의 내용물을 삭제하니 런타임 오류가 떠서 따로 뺐습니다.

이 부분에서 시간을 더 잡은 것 같다고도 생각하지만, 그래도 O(n)의 시간이 추가되는 것 뿐이라 저렇게 2배이상 시간초과가 날정도같아 보이지 않아서 의아합니다..)

리스트 이용한 제출 : http://boj.kr/219307a14b864ee5...

셋 이용한 제출 : http://boj.kr/7e14fadca7544907...

amsminn   2년 전

set의 상수가 매우 커서 그럴듯합니다.

kckc0608   2년 전

답변 감사합니다. set의 상수라는 게 혹시 어떤 것인지 더 설명해주실 수 있나요? 

저는 set 자료구조가 가지는 상수라고 이해했는데, 구글에 'set 상수' 'python set constant' 등의 검색을 해보아도 변수와 상수, 리터럴에 대한 개념 설명된 글이 나와서 검색이 잘 안됩니다ㅠㅠ

sonjaewon   2년 전

set 시간복잡도 앞에 붙는 상수가 매우 크기 때문에 거의 O(log^2N) 라고 하네요.

amsminn   2년 전

흔히 시간복잡도를 표기할 때 big o notation를 사용하기 때문에 n이나 2n, 10n들이 모두 O(n)입니다. 상수는 이 1,2,10을 의미하고요. 

kckc0608   2년 전

앗 시간복잡도에 붙는 상수시간을 말씀하신 것이군요. 이해했습니다! 두 분 모두 친절한 설명 감사드립니다 :)

set 자료구조는 꼭 필요한 상황이 아니면 사용을 자제해야겠네요..

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