inflearn logo
강의

Course

Instructor

Do it! Algorithm Coding Test with C++

백준 1325, 교재 47번 문제 질문입니다.

Resolved

358

sprtms53254189

3 asked

0

교재에서는 bfs로 구현했는데 저는 dfs로 구현해봤습니다.

그랬더니 시간초과가 발생했네요. 제가 작성한 코드가 올바른답이긴하지만 시간초과가 발생하는건지, 아니면 그냥 틀린건지 궁금합니다. 또한 올바른답 이맞다면 왜 시간초과가 발생하는지(시간복잡도 차이가 왜 크게 나는지)도 궁금합니다.

 

#include <iostream>

#include <vector>

#include <queue>

using namespace std;

int maxdepth=-1;

vector<vector<int>> a;

vector<bool> visited;

void dfs(int k, int depth);

int main() {

ios::sync_with_stdio(false);

cin.tie(NULL);

cout.tie(NULL);

int n,m;

cin >> n >> m;

a.resize(n + 1);

visited = vector<bool>(n + 1, false);

for (int i = 0; i < m; i++) {

int s,e;

cin >> s >> e;

a[e].push_back(s);

}

vector<int> result(n + 1, 0);

for (int i = 1; i <= n; i++) {

dfs(i, 0);

result[i] = maxdepth;

maxdepth = -1;

fill(visited.begin(), visited.end(), false);

}

int realmax = -1;

for (int i = 1; i <= n; i++) {

if (result[i] > realmax)realmax = result[i];

}

for (int i = 1; i <= n; i++) {

if (realmax==result[i])cout<<i<<' ';

}

}

void dfs(int k, int depth) {

if (maxdepth < depth)maxdepth = depth;

visited[k] = true;

for (int i : a[k]) {

if (!visited[i]) {

dfs(i, depth + 1);

}

}

visited[k] = false;

}

 

c++ 코딩-테스트 알고리즘

Answer 1

1

communityai8509

안녕하세요, 인프런 AI 인턴입니다.

주신 코드를 살펴보았습니다. 답변 드리기에 앞서, 코드가 올바른지에 대해서는 직접 실행하여 정답을 검증해야 하겠지만, 시간 초과의 문제는 다른 이유일 가능성이 큽니다.

시간 초과가 발생하는 경우는 주로 알고리즘의 시간 복잡도가 문제를 푸는데 요구되는 시간 제한을 초과할 때 발생합니다. DFS(깊이 우선 탐색)는 자료 구조의 특성상 불필요한 깊은 탐색을 많이 하게 되는 경우가 있습니다. 특히, 그래프가 밀집되어 있을 때(stack이 깊어질 때) 오버헤드가 커질 수 있습니다.

추가적으로, 각 노드를 방문할 때마다 visited 벡터를 fill 함수로 초기화하는 부분이 있다면, 해당 연산도 시간 복잡도에 영향을 줍니다. 이 경우, 각 노드를 시작으로 DFS를 할 때마다 O(N)의 시간 복잡도를 가지게 되므로, 전체 노드에 대해 수행하면 시간 복잡도가 O(N^2)가 됩니다.

상대적으로 BFS(너비 우선 탐색)는 매 탐색 시 불필요한 경로를 조기에 배제하면서 탐색을 진행하기 때문에, 간선의 개수에 비례하는 O(N + E)의 시간 복잡도를 가집니다. 따라서 BFS가 DFS보다 더 효율적인 경우가 많습니다.

코드 최적화를 위해서는 다음과 같은 방법을 시도해 볼 수 있습니다.

  1. visited 벡터를 매번 초기화하지 않고, DFS 호출 시 이전에 방문했던 노드를 기록하는 추가적인 방법을 사용해 볼 수 있습니다.
  2. 메모이제이션(Memoization)을 통해 이미 계산된 결과를 저장하고 재사용하여 중복 계산을 줄입니다.
  3. 각 노드간의 관계를 효율적으로 표현하는 자료 구조를 사용합니다. 예를 들어, 인접 리스트 대신 인접 행렬을 사용할 수 있습니다.

마지막으로, 실제 온라인 저지 시스템에서 답안 제출 시 시간 초과가 계속 발생한다면 다른 알고리즘으로 접근 방식을 바꿔 문제를 해결해야 할 수도 있습니다.

수강평 이벤트

0

15

2

Reticle이 안나옵니다.

0

5

1

진행 방법 질문드립니다!

0

23

2

안녕하세요. 바뀐 채점사이트 관련해서 문의드립니다.

0

18

1

Singleton 관련 질문입니다.

1

27

2

갑자기 채점 사이트가 바뀌었어요

0

19

1

42. [세그먼트 트리 실전 문제] 구간 합 구하기3 (백준 2042)

0

64

1

10986번 질문 있습니다!

0

45

0

LCA 빠르게 찾기 - 트리의 높이에 따른 k값 질문

0

119

0

백준 1377 질문있습니다

0

218

1

백준 1722 교재 81 질문

0

330

1

백준11505, 교재 73번

0

282

1

백주 1456번

0

200

1

백준 11404 플로이드 문제 질문있습니다.

0

260

1

문제 85번 질문드립니다

0

322

1

백준 13023 질문있습니다.

0

204

1

문제 8번 질문드립니

0

305

1

백준 1876여행 유니온 파인드 질문있습니다.

0

241

1

백준 2251 C++ 질문 있습니다.

0

398

2

퀵정렬 질문

3

291

1

i==k일떄 i++안해도되지않나요

0

436

1

알고리즘 코딩테스트 문제풀이 강의 - 14 절댓값 힙 구현하기 (백준 11286)

0

550

1

알고리즘 코딩테스트 문제풀이 강의 - 9 DNA 비밀번호 (백준 12891)

1

573

1

C++은 실전문제에 대한 강의가 없나요? 자바나 파이썬은 있는데 없는거 같아서요.

2

591

2