2252번 - 줄 세우기
리스트를 쓰니 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...
set의 상수가 매우 커서 그럴듯합니다.
답변 감사합니다. set의 상수라는 게 혹시 어떤 것인지 더 설명해주실 수 있나요?
저는 set 자료구조가 가지는 상수라고 이해했는데, 구글에 'set 상수' 'python set constant' 등의 검색을 해보아도 변수와 상수, 리터럴에 대한 개념 설명된 글이 나와서 검색이 잘 안됩니다ㅠㅠ
set 시간복잡도 앞에 붙는 상수가 매우 크기 때문에 거의 O(log^2N) 라고 하네요.
흔히 시간복잡도를 표기할 때 big o notation를 사용하기 때문에 n이나 2n, 10n들이 모두 O(n)입니다. 상수는 이 1,2,10을 의미하고요.
앗 시간복잡도에 붙는 상수시간을 말씀하신 것이군요. 이해했습니다! 두 분 모두 친절한 설명 감사드립니다 :)
set 자료구조는 꼭 필요한 상황이 아니면 사용을 자제해야겠네요..
댓글을 작성하려면 로그인해야 합니다.
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...