-
카테고리
-
세부 분야
게임 프로그래밍
-
해결 여부
해결됨
Vertex참조부분 문의드립니다.
21.02.17 02:53 작성 조회수 184
1
안녕하세요.
이해가 가지않아서 문의드립니다.
뒤에 DFS나 BFS는 이해가 갔는데요. 이부분에서 이해 못하고 넘어간게 걸려서 다시 돌아왔습니다. 혹시나 도움이 될까 연결리스트부분을 다시 듣고 이해한 후 봐도 또이해가 가지않는데요,,
class Vertex
{ public List<Vertex> edges = new List<Vertex>();}
이 부분이 연결리스트에서 보면 그냥 참조(주소)값인데
연결리스트에서는 다음방의 주소, 이전방의 주소 이거였으니
저 구문의 뜻은 edges라는 참조(주소)값 으로 이해했습니다.
그냥 참조값 끝 왜만들었는지 의문?이듭니다..
그리고 CreateGraph()에서
List<Vertex> v = new List<Vertex>(6) 이부분을 디버깅하면
new Vertex() 마다 위에 edges 참조에 갔다가 오는데.. 왜이러는지도 모르겠습니다.
그리고 edges.Add(v[1])이면 이해하는데 어떻게 v[0].edges.Add(v[1]); 이게되는지 이해가 가지않습니다. 어떻게 v가 edges를 메서드처럼 쓰는지..
이부분이 이해가가지않아 2틀째 고뇌하고있습니다.. 다음강의를 듣다가도 그게 왜그런지 싶어 집중이 되지않네요..
감사합니다.
답변을 작성해보세요.
2
Rookiss
지식공유자2021.02.17
리스트 안에 참조값 자체를 넣어서 헷갈릴 수 있으니
ID를 부여해서 관리하면 다음과 같습니다.
다음과 같이 연결해주고.
메모리를 살펴봅시다.
모든 Vertex 목록은 다음과 같습니다.
그 중에 0번 정점을 살펴보면 다음과 같습니다.
0번 정점과 연결된 목록은 edges를 통해서 확인이 가능한데요.
2개가 연결되어 있는데 참조값이라서 헷갈리니 ID를 확인하면.
ID=1, ID=3번인 Vertex가 저장되어 있음을 확인을 수 있습니다.
1
Rookiss
지식공유자2021.02.17
정점은 위에서 동그라미 표시로 되어 있는 애들이고,
정점끼리는 화살표로 연결 관계가 있습니다.
위 그림에서 0번 정점은 1번, 3번 정점으로 갈 수 있고, 이것을 간선(edge)라고 합니다.
class를 설계할 때 멤버 변수를 넣을 수 있는데요.
class Knight
{
public int hp;
}
이러면 Knight는 hp를 갖고 있겠죠.
마찬가지로 Vertex라는 정점 클래스를 설계할 때, 인접한 정점이 딱 한개라면 다음과 같이 만들겁니다.
class Vertex
{
Vertex neighbor;
}
Vertex 안에 멤버변수를 Vertex를 갖고 있는게 당혹스러울 수도 있지만,
LinkedList에서 살펴본 Node와 비슷한 사용법입니다.
그런데 현재 위 그림에서 보면 Vertex가 딱 1개의 정점만 연결되어 있는게 아니라,
다수의 정점과 연결되어 있을 수 있는데요.
class Vertex
{
List<Vertex> edges;
}
그래서 최종적으로 위와 같이 설계가 된 것이죠.
정점마다 연결된 이웃 정점이 다르니, 각기 세팅을 해준 것입니다.
0->1, 0->3 연결이 되어 있으니
이렇게 0번 정점의 edges 에 1, 2번 정점을 추가해준거죠.
0
손기명
질문자2021.02.17
아 방금 디버그로 정말 많은걸 깨달았습니다.
우선 메서드 밖에 객체를 생성한것이(호출안해 아직 생성안됨)
아래 메서드에서 객체를 만들때마다 생성이되는군요.
아 다깨닫게 되었습니다.
그래서 각 v 객체마다 위 밖에있는 만들어놓은 리스트에
생성해서 넣은거군요!!!!! 와 진짜 메서드 밖에 리스트가 메서드 안에서 호출할때 생성되어 그 리스트 멤버변수를 불러서 그 생성된 객체에 저장하고있던거군요.
즉 v[0]객체의 생성된 멤버 리스트 객체 edges[0] = 1, edges[0] = 2
정말 감사합니다 생성자도아닌데 왜 클래스 리스트멤버 객체가 만들어졌다고 생각했는지ㅠㅠ..
아 감사합니다.!!
0
손기명
질문자2021.02.17
아 이제 들어가는건 이해를 하였습니다. v는 클래스 객체이므로 그에 속한 멤버변수에 접근이 가능해서
v[0].edges.Add(v[1]); 이런 표현이 가능한건데 다만 아직 이해가 안가는 부분은 v[0].edges.Add(v[1])입니다.
0번 정점의 edges에 1, 2번을 추가한다고 하셨는데 링크드리스트는 방이 들어가고 삭제되는 것을 확인이가능하였는데.
v[0].edges.Add(v[1])는 연결이 되었는지 어떻게 확인할 수 있나요?
디버그를 돌려보아도 조사식에 count6으로만 나오고 콘솔로 찍어보아도 System.Collections.Generic.List`1[ConsoleApp1.Vertex] 이런식의 이상한 글만나오게 되어서
지금 서로 연결이 된것인지 아니면 저위에값이 v[0]에 edges(v[1])을 넣고 뭘하는것인지
알수가없어서 어떻게 확인할 수있을까요? 지금 제 머리에는 그냥 추상적으로
v[0].edge.Add(v[1])을 하면 알순없지만 v[0]정점과 v[1]정점이 연결되는구나라고만
생각이되어서요.
LinkedList를 생성해서 넣으면
link.AddFirst(100);
또는 LinkedListNode<int> a = link.AddLast(101);
이런식으로 아 어디저장이되는구나 직관적이고 이해가가는데 저위에 방식은
추상적이고 이해가 잘가지않습니다..
답변 4