코딩테스트/자료구조

7. 그래프

초코chip 2024. 4. 12. 17:41

노드 관점

해당 노드에 연결된 다른 노드가 뭔지 알고싶을때

0: []
1: [3,2]
2: [1]
3: [4]

 

정수 노드

가중치가 없는 그래프

ArryList<ArrayList<Integer>> graph = new ArrayList<ArrayList<Integer>>();
// 노드 개수만큼 추가
for (int i = 1; i <= n; i++) {
    graph.add(new ArrayList<Integer>());
}

StringTokenizer st;
for(int j=0; j<m; j++){
    st = new StringTokenizer(br.readline());
    int s = Integer.valueOf(st.nextToken());
    int e = Integer.valueOf(st.nextToken());
    graph.get(s).add(e);
}


/* 간선 정보가 아래 처럼 들어온다.
간선 개수 m
1 3
3 4
5 6
*/

0: []
1: [3]
2: []
3: [4]
4: []
5: [6]
6: []

 

가중치 그래프

클래스로 구현하는 방법

class Node {
    int index;
    int distance;

    public Node(int index, int distance) {
        this.index = index;
        this.distance = distance;
    }
}


ArrayList<ArrayList<Node>> graph = new ArrayList<ArrayList<Node>>();
// 노드 개수만큼 추가
for (int i = 1; i <= n; i++) {
    graph.add(new ArrayList<Node>());
}

StringTokenizer st;
for(int j=0; j<m; j++){
    st = new StringTokenizer(br.readline());
    int s = Integer.valueOf(st.nextToken());
    int e = Integer.valueOf(st.nextToken());
    int w = Integer.valueOf(st.nextToken());
    graph.get(s).add(new Node(e,w));
}

0: []
1: [Node(index=2, distance=5)]
2: [Node(index=3, distance=10)]
3: []

 

단순 배열을 사용하는 방법

int n = 4; // 노드의 개수
ArrayList<ArrayList<int[]>> graph = new ArrayList<>();
for (int i = 0; i < n; i++) {
    graph.add(new ArrayList<>());
}


StringTokenizer st;
for(int j=0; j<m; j++){
    st = new StringTokenizer(br.readline());
    int s = Integer.valueOf(st.nextToken());
    int e = Integer.valueOf(st.nextToken());
    int w = Integer.valueOf(st.nextToken());
    graph.get(s).add(new int[] {e,w});
}

0: 
1: [2, 5] 
2: [3, 10] 
3:

 

다른 타입 노드 표현

HashMap을 통해 구현 가능

HashMap<Character, ArrayList<Character>> graph = new HashMap<>();
int n; // 노드의 개수
int m; // 간선의 개수

// 노드 입력받기
System.out.println("노드 개수 n을 입력하세요: ");
n = Integer.parseInt(br.readLine());
System.out.println("노드를 입력하세요 (예: A B C): ");
StringTokenizer nodeTokenizer = new StringTokenizer(br.readLine());
while (nodeTokenizer.hasMoreTokens()) {
    char node = nodeTokenizer.nextToken().charAt(0);
    graph.put(node, new ArrayList<>());
}

// 간선 입력받기
System.out.println("간선 개수 m을 입력하세요: ");
m = Integer.parseInt(br.readLine());
System.out.println("간선을 입력하세요 (예: A B): ");
for (int j = 0; j < m; j++) {
    StringTokenizer edgeTokenizer = new StringTokenizer(br.readLine());
    char start = edgeTokenizer.nextToken().charAt(0);
    char end = edgeTokenizer.nextToken().charAt(0);
    graph.get(start).add(end);
}

A: [B]
B: [C]
C: []

 

간선 관점

그래프를 형성하는 간선들을 확인하고 싶을때 사용

class Edge implements Comparable<Edge> {
    int distance;
    int nodeA;
    int nodeB;

    public Edge(int distance, int nodeA, int nodeB) {
        this.distance = distance;
        this.nodeA = nodeA;
        this.nodeB = nodeB;
    }
}

ArrayList<Edge> edges = new ArrayList<>();

// 모든 간선에 대한 정보를 입력 받기
for (int i = 0; i < e; i++) {
    int a = sc.nextInt();
    int b = sc.nextInt();
    int cost = sc.nextInt();
    edges.add(new Edge(cost, a, b));
}

[Edge(distance=4, nodeA=1, nodeB=2), Edge(distance=6, nodeA=2, nodeB=3)]

'코딩테스트 > 자료구조' 카테고리의 다른 글

자료구조 총 정리  (0) 2024.07.11
6. 우선순위 큐(PriorityQueue)  (0) 2024.04.12
5. 덱(Deque)  (0) 2024.04.12
4. 큐(Queue)  (0) 2024.04.12
3. 스택(Stack)  (0) 2024.04.12