굉장히 비효율적입니다. 이 문제는 BFS 또는 DFS를 이용하여 모든 간선을 두 번 이하로 방문하고 답을 구할 수 있으며, 이렇게 해결할 경우 정점과 간선이 10만 개씩 되더라도 빠르게 답을 구할 수 있습니다.
그러나 이 풀이에서는 최악의 경우 하나의 간선을 n번에 가깝게 방문하게 됩니다. 아래와 같은 예시에서 프로그램이 어떻게 동작할지 생각해 보세요.
또한 vector의 erase 연산 역시 비효율적입니다. vector의 중간에 있는 값을 지울 경우 그 뒤에 있는 값들을 전부 한 칸씩 앞으로 당겨 와야 하므로, vector에 들어 있는 원소의 개수에 비례하는 시간이 걸립니다.
dreamian 6년 전
문제는 다음과 같이 접근하였습니다.
1) connected의 bool 타입 배열을 선언하여 노드 '1'과 연결 상태인지 확인하도록 하였습니다.
2) 일단 표준 입력에서 두 노드를 입력받아 둘 중 하나가 이미 연결되어 있는 경우, 해당 노드의 connected 값을 true로 바꾸는 방식으로 접근했습니다.
3) 만약, 두 노드 모두 연결되어 있지 않다면 spare의 pair형 벡터에 담아두었습니다.
4) 모든 입력값을 처리한 후에 spare 벡터를 순차적으로 탐색합니다.
5) spare 벡터 내에서 해당 원소값 중 하나가 연결된 상태라면 나머지 한 짝도 connected 시키는 방식으로 구현했습니다. 이때 해당 원소는 벡터에서 삭제 처리합니다.
6) 5)의 과정을 spare 벡터의 size값의 변함이 없을 때까지 반복합니다.
많은 분들의 코드를 보면 vector의 erase 연산을 사용하는 경우가 거의 없어 제가 접근하는 방식이 효율적인 방식인지 궁금합니다.
해당 vector의 size를 0으로 시작해서 size값을 계속 높여나가는 방식이 좋은 것일까요?
원소의 삽입 삭제가 빈번히 일어나는데 이러한 방식이 과연 효율적일지 갈피를 못 잡겠어서 고수님들의 의견을 듣고싶습니다.
다행히 해당 문제는 n값이 100이하로 제한이 되어 0ms로 AC받긴 했지만, n값이 커지는 경우에는 과연 효율적인 것일지 궁금합니다.