Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

그래프] 숨바꼭질4 - 백준 13913번 #88

Merged
merged 5 commits into from
Nov 12, 2020
Merged

Conversation

Kwakcena
Copy link
Owner

@Kwakcena Kwakcena commented Nov 11, 2020

숨바꼭질 4

기존의 숨바꼭질 문제와 비슷하지만 이동 경로를 출력해야 한다는 점이 다르다.

나는 무엇을 할 수 있게 되었는가?

n에서 m으로 가는 정점의 순서를 출력하는 재귀 함수 작성을 할 수 있게 되었다.
이 문제에서 int from[MAX]from[i] 는 i 정점으로 오기 전 정점 값을 갖는다.

문제의 예시처럼 5 -> 17 의 경우 from은 다음과 같은 값을 갖는다.

from[4] = 5
from[8] = 4
from[16] = 8
from[17] = 16

따라서 역순으로 출력해야 하기 때문에 재귀는 다음과 같다.

void print(int n, int m) {
  if(n != m) {
    print(n, from[m]);
  }
  cout << m << " ";
}

만약 거꾸로 된 상태 그대로 출력하겠다면 for문으로 간단하게 출력할 수 있다.

for(int i=m; i!=n; i=from[i]) {
  cout << i << " ";
}
cout << n << endl;

만약 이동경로를 저장하고 이를 거꾸로 출력한다면 이렇게 하자.

- 기존의 숨바꼭질 문제와 다른점은 이동한 경로를 출력해야 한다는 점이다.
- 따라서 bfs를 돌면서 이동 경로 또한 리스트에 저장했더니 메모리 초과가
  발생하였다.
- 질문 부분에서 메모리 초과를 방지하는 방법으로 딕셔너리를 사용하는
  방법이 소개되었다.
- 이를 이용해 이동 경로를 딕셔너리로 저장하였다.
다음 위치에 대한 접근을 for문으로 바꿈
- 20만개를 생성하니 메모리 초과가 발생하는 것 같다.
- cpp에서는 딕셔너리같은 자료구조가 있나?
map을 이용해서 이동한 경로를 저장하여 문제 풀이
map을 쓰지 않고 일반 배열을 선언하여 지나온 경로를 저장하였더니 시간이
크게 단축되었다.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

1 participant