Hyemi Lee

Hyemi Lee

주니어 개발자의 삽질과 기록

Data Structure, Graph, 프로그래머스 가장먼 노드(49189)

그래프 구성요소

1. 정점(vertex / node)

: 위치를 나타낸다.

: 위치간의 관계, 정점을 연결하는 선

3. 인접 정점

: 간선에 의해 직접 연결된 정점

4. G(V,E)

: 그래프는 정점과 간선의 집합이므로 G(V,E)는 그래프 자체를 의미

그래프의 종류

무방향 그래프

: 간선을 통해 양방향으로 이동할 수 있는 그래프

간선 그래프

: 간선에 방향이 존재하는 그래프

가중지 그래프

: 간전에 비용 또는 가중치가 할당되 그래프 ‘네트워크’라고도 함

연결 그래프

: 무바향 그래프에서 모든 정점쌍들에 대해 항상 경로가 존재하는 그래프

비연결 그래프

: 무방향 그래프에서 특정 정점쌍들에 경로가 존재하지 않는 그래프

인접 정점 나타내기

(인접행렬/인접리스트)

인접 리스트

  • ArrayList로 구현한다
  • 노드수만큼 ArrayList를 선언한다
  • 간선의 정보를 이용하여 노드에 연결된 다른 노드를 넣어준다
// n: 노드개수
// int[][] edge = [[1,2], [3,4]];
List<ArrayList<Integer>> listGraph = new ArrayList<>();
// 그래프 노드별로 정보 연결할 준비.
// 0,1,2,3,4,...n까지 기본 노드들을 만든다.
for (int i = 0; i <= n; i++) {
 listGraph.add(new ArrayList<Integer>());
}
// [1,2] 라면
// listGraph.get(1).add(2)	// 1번노드는 2와연결
// listGraph.get(2).add(1)	// 2번노드는 1과연결
for (int i = 0; i < edge.length; i++) {
 listGraph.get(edge[i][0]).add(edge[i][1]);
 listGraph.get(edge[i][1]).add(edge[i][0]);
}

인접 행렬

  • 배열을 이용한다
  • map[i][j] = 1 , i->j j->i로 이동가능함을 표현.
  • 단점 : 노드수가 많아질수록 메모리를 많이 차지한다.

문제 풀이

프로그래머스 - 가장먼 노드

코드

package org.programmers;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class Level3_49189 {
	public static void main(String[] args) {
 // github 페이지 빌드가 안되서 주석처리 & 중괄호 없앰.
 //int[][] edge = [7,5] [4,2] [3,6] [4,3] [3,2] [1,2] [2,3]
		int n = 7;
		solution(n, edge);
	}
	public static int solution(int n, int[][] edge) {
		boolean[] visited = new boolean[n + 1];
		List<ArrayList<Integer>> listGraph = new ArrayList<>();
		// == 그래프 노드별로 정보 연결할 준비.
		// 0,1,2,3,4,...n까지 기본 노드들을 만든다.
		for (int i = 0; i <= n; i++) {
			listGraph.add(new ArrayList<Integer>());
		}
 // == 그래프 연결
		// [1,2] 라면
		// listGraph.get(1).add(2)	// 1번노드는 2와연결
		// listGraph.get(2).add(1)	// 2번노드는 1과연결
		for (int i = 0; i < edge.length; i++) {
			listGraph.get(edge[i][0]).add(edge[i][1]);
			listGraph.get(edge[i][1]).add(edge[i][0]);
		}
		Queue<Integer> nextQ = new LinkedList<>();
 //== 1번부터 출발
 nextQ.offer(1);
		visited[1] = true;
		int size = 0;
		while (!nextQ.isEmpty()) {
			size = nextQ.size();
			// while문을 한번 돈다 -> 1번 깊이 들어간다.
			// 가장 멀리 있는 곳을 찾아야 하기때문에
 // while을 마지막에 돌았을때 도착하는 노드들의 개수 = size를 구하면된다.
			for (int i = 0; i < size; i++) {
				int cur = nextQ.poll();
				visited[cur] = true;
				// 해당 노드와 연결된 노드중 아직 방문하지 않는 노드를 방문한다.
				for (Integer node : listGraph.get(cur)) {
					if (visited[node] == false) {
						nextQ.offer(node);	// 다음에 방문하도록 큐에 넣어준다.
						visited[node] = true;
					}
				}
			}
		}
		System.out.println(size);
		return size;
	}
}

참고

Share on

Twitter Facebook LinkedIn

You may also enjoy

Redis Stream

2021年04月28日

Stream Stream은 로그 데이터를 처리하게위해 5.0에서 새로 도입된 데이터 타입입니다. 대량의 데이터가 연속적으로 발생할때 처리하기 위해 등장했습니다. 기존 데이터를 수정하지 않고 오직 추가로 발생합니다. 이런 종류의 데이터를 stream or log데이터...

Study, Object, chapter2&3 presentation

2021年04月20日

chapter03. 역할, 책임, 협력 객체지향 설계란, 올바른 객체에게 올바른 책임을 할당하면서 낮은 결합도와 높은 응집도를 가진 구조를 창조하는 활동이다.

Spring, chatting 프로그램 만들기, Reactive란?

2020年06月16日

Reactive 막힘없이 흘러다니는 data(event)를 통해 사용자에게 자연스러운 응답을 주고 규모 탄력적으로 리소스를 사용하며 실패에 있어서 유연하게 대처한다 모든 지점에서 블럭 되지 않게 하자 oop와 같은 패러다임 모든 것을 비동기적인 data의 strea...